0

在我的应用程序中,我有模型 Category、Item、Property 和 PropertyValuation。这个想法是一个类别包含项目,一个项目有几个属性。PropertyValuation 的目的是存储特定项目的属性值。模型定义如上:

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
end

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

  has_many :property_valuations, :dependent => :destroy  
  has_many :properties, :through => :property_valuations 

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

end

class Property < ActiveRecord::Base
  attr_accessible :name, :description, :value_type, :unit, :unit_id

  has_many :property_valuations, :dependent => :destroy  
  has_many :items, :through => :property_valuations
  has_many :property_ranges, :dependent => :destroy

  belongs_to :unit
end

class PropertyValuation < ActiveRecord::Base     
  attr_accessible :property, :item, :value, :categorization

  belongs_to :property
  belongs_to :item
end

现在我的问题是,我已经成功地通过这样做来按名称过滤类别项目:

@category.items.where("lower(items.name) like ?", "%#{params[:keywords].downcase}%")

但现在我还想根据关联的属性值过滤这些项目。我收到属性 ID 和每个属性的值(精确值、最小值或最大值),其想法是动态构建查询。给定我的模型,例如,我该怎么做:我想要名称包含“foo”的项目,其中 id=1 的属性值为 2,id=2 的属性值为 <10,id=8 的属性具有值>2 和值<5。

4

1 回答 1

0

您可以将搜索从PropertyValuation模型中移开并将其加入产品和类别模型

valuations = PropertyValuation.joins(:item)
                              .where(value: 2, property_id: 1)
                              .where('lower(items.name) LIKE ?', "%#{params[keywords].downcase}%")
items      = valuations.map(&:item)

有一个宝石可以让这件事变得更容易,一个是 Ransack https://github.com/ernie/ransack

Item.search(name_contains:                   params[:keywords], 
            product_valuations_value_equals: 2, 
            product_valuations_property_id:  1)
于 2013-04-09T04:32:16.813 回答