2012-09-20 58 views
0

我有一個Box,其中有許多包含許多屬於Category的項目的Compartments。項目是多態的(:可迭代的),因爲它們可以屬於沒有隔室的箱子 - 這可能是我的難處。過濾從Rails熱切加載的結果

我可以打電話給所有的項背在數據庫中的所有框,在框中控制器:

@category_items = Item.includes(:category).group("categories.name").sum("quantity * value") 

,但我怎麼能過濾這些下降到那些只屬於當前盒ID?

回答

0

嘗試

compartment_ids = %(SELECT id FROM compartments WHERE box_id = :box_id) 

@category_items = Item.includes(:category).where("(itemable_type = 'box' AND itemable_id = :box_id) OR (itemable_type = 'compartment' AND itemable_id IN (#{compartment_ids}))", :box_id => box_id).group("categories.name").sum("quantity * value") 
+0

謝謝邁近了一步。我在itemable_id IN中遇到了一個語法錯誤,所以切換到itemable_id =?,這個工作正常,直到我有多個分區 - 然後我得到一個無效的語句,例如itemable_type ='Compartment'AND itemable_id = [19,20,21] ,關於如何處理這組ID的任何想法? – ritchielee

+0

對不起,我修改了IN子句的格式。它應該是可迭代IN(item1,item2,...)的形式。看看這是否有效。 – cdesrosiers

+0

請注意,這涉及主SQL查詢內嵌入的「SELECT」查詢。 – cdesrosiers

0

沿着這些路線試試:

@category_items= Item.includes(:category).filter(params[:box], [:box_id,:compartment_id, "categories.name"]) 
+0

我曾嘗試過濾器,但得到:未定義的方法'過濾器' – ritchielee