2010-04-24 68 views
0

http://github.com/collectiveidea/awesome_nested_set軌搜索類別的子類別

真棒組嵌套的插件,目前,如果讓我選擇一個子類別作爲我CATEGORY_ID一個項目,我不能其父搜索。

Category.parent 
    Category.Child 

我選擇Category.child作爲我的物品所在的類別。所以現在我的物品的category_id已存儲在其中。

如果我在我的Rails應用程序中訪問一個頁面,可以說類別頁面和我在Category.parent的頁面上,我想要顯示具有所有後代的category_id的產品。

所以理想情況下,我想有一個可以考慮到後代的查找方法。您可以通過調用root.descendants(一種內置的插件方法)來獲取根的後代。

我該如何去做,所以我可以查詢獲取根的後代的查找,而不是現在正在做的事情,除非產品具有Category.parent的特定category_id,否則它什麼都沒有。

我希望我在這裏很清楚。我需要找出一種方法來創建一個find方法或named_scope,它可以查詢和返回一個對象的數組,這些對象具有相應的根,或者如果我有其他選項,它們是什麼?

我想過在我的產品表中創建一個字段,比如可以跟蹤父項的parent_id,這樣我就可以創建兩個命名範圍,一個找到父項,一個找到子項並鏈接它們。

我知道我可以爲每個孩子創建一個命名作用域,並將它們鏈接在一起用於多個孩子,但這似乎是一個非常乏味的過程,而且,如果添加更多的孩子,則需要指定更多的命名作用域。

//this is what i tried first 
@category = Category.find(params[:id]) 
@child_products = @category.descendants.products 

//this actually works but only for one 
@child_products = @category.descendants.first.products 

因爲某個產品屬於某個類別,而某個類別有許多產品。然而,後代函數會返回所有後代的數組。我如何過濾這些並獲得組合產品?

回答

1

將指定的範圍移動到您的Product模型,因爲這是您要顯示的內容。

# product.rb  
named_scope :for_category_ids, lambda {|ids| {:conditions => {:category_id => ids}}} 

然後在你的控制器:

@products = Product.for_category_ids(@category.descendants.map(&:id)) 
+0

哎JDL確實,如果類別具有多個子類別這項工作? Mysql ::錯誤:操作數應該包含1列:SELECT * FROM'products' WHERE(category_id = 4,5)LIMIT 0,4 是我回來了。感謝您的迴應! – jim 2010-04-24 18:36:20

+0

是的,它應該可以用於任何ID的列表。當我第一次發佈這個時,我錯過了named_scope中的一個大括號。再試一次,看看它是否適合你。 – jdl 2010-04-24 18:54:21

+0

啊謝謝jdl我很欣賞這一點。我已將named_scope更改爲named_scope:for_category_ids,lambda {| ids | {:conditions => [「category_id =?」,(ids)]}}這是它失敗的原因。非常感謝。 – jim 2010-04-24 19:42:53