rails搜索子类别的类别

时间:2010-04-24 17:42:48

标签: ruby-on-rails ruby plugins nested

http://github.com/collectiveidea/awesome_nested_set

非常好的嵌套集插件,目前,如果我选择子类别作为项目的category_id,我就无法通过其父级进行搜索。

Category.parent
     Category.Child

我选择Category.child作为我的项目所在的类别。所以现在我的项目中存储了category_id为4。

如果我转到我的rails应用程序中的一个页面,让我们说类别页面,我在Category.parent的页面上,我想展示具有所有后代的category_id的产品。

理想情况下,我想要一个可以考虑后代的find方法。您可以通过调用root.descendants(内置插件方法)来获取根的后代。

我将如何制作它以便我可以查询获取根的后代而不是现在正在做什么的查找,除非产品具有Category.parent的特定category_id,否则什么都没有。

我希望我在这里清楚。我要么想出一种方法来创建一个find方法或者named_scope,它可以查询并返回一个对象数组,这些对象的id对应于一个根的后代,或者如果我还有其他任何选项,它们是什么?

我考虑过在我的product表中创建一个像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 个答案:

答案 0 :(得分:1)

将命名范围移至Product模型,因为这是您要显示的内容。

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

然后在你的控制器中:

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