1

在我的应用程序中,我有如上定义的模型项目、类别和分类:

    class Item < ActiveRecord::Base
      attr_accessible :name, :description, :property_valuations, :barcode

      has_many :categorizations
      has_many :categories, :through => :categorizations
    end

    class Category < ActiveRecord::Base
      attr_accessible :name, :description, :parent, :children, :items, :parent_id

      has_many :children, :class_name => "Category", :foreign_key => "parent_id", :dependent => :nullify
      belongs_to :parent, :class_name => "Category"

      has_many :categorizations
      has_many :items, :through => :categorizations

      def all_children(children_array = [])
        children = Category.where(:parent_id => self.id).includes(:items)

        children_array += children.all
        children.each do |child|      
          children_array = child.all_children(children_array)
        end
        children_array
      end

    end

class Categorization < ActiveRecord::Base
  attr_accessible :category, :item

  belongs_to :category
  belongs_to :item

end

我正在递归搜索类别树以查找与类别关联的项目。但是,除了按 parent_id 过滤类别之外,我还想应用过滤器项目名称。我该怎么做(我期待类似的东西Category.where(:parent_id => self.id).includes(:items).where(:name => 'something...'))?

提前致谢!

4

2 回答 2

0

你可以做

Category.where(:parent_id => self.id).includes(:items).where("items.name like ?", '%cheap%')

这将获得类别以及符合条件的项目。

IE:

categories = Category.where(:parent_id => 2).includes(:items).where("items.name like ?", 'AA%')
categories.first.items.size # -> 2
categories.first.id # -> 1
Category.find(1).items.size # -> 3
Category.find(1).items.where("name like ?", 'AA%').count # -> 2

如果您只想获取父类别的子类别的项目:

parent_category = Category.find(2)
Item.joins(:categories).where(categories: {parent_id: parent_category.id}).where("items.name like ?", 'AA%')
于 2013-04-02T23:24:02.080 回答
0

您的数据库可能支持递归查询(以避免您的 all_children 函数的手动递归),例如通过 with 命令的 postgres,但 rails 没有访问它的包装器。如果这种递归发生很多,可能值得在这里阅读:http: //gmarik.info/blog/2012/10/14/recursive-data-structures-with-rails——看起来确实有一些有前途的宝石解决了这个问题,但我个人没有使用过它们中的任何一个。

于 2013-04-02T23:33:31.453 回答