我在rails模型之间有关联。
有三种描述product
属性的模型:
Property
正在关联模型,每个属性都有一个名称和值。
class Property < AR::Base
belongs_to :product
belongs_to :property_name
belongs_to :property_value
class PropertyName < AR::Base
has_many :properties
validates :name, presence: true, uniqueness: true
class PropertyValue < AR::Base
has_many :properties
validates :value, presence: true, uniqueness: true
通过thinking-sphinx搜索后,我得到了facets - property_values id&amp; property_names id collections。
使用该结果,然后我尝试查找当前products
列表的所有属性(以继续过滤这些搜索结果)。
在我使用的控制器中:
@property_names = PropertyName
.where(id: property_name_ids)
.includes(:property_values).where('property_values.id IN (?)', property_value_ids)
我的观点:
- @property_names.each do |property_name|
h4 = property_name.name
- property_name.property_values.pluck(:value).uniq.each do |property_value|
= check_box_tag ...
= label_tag ...
因此,急切加载不起作用。 Rails为数据库生成了大量(n + 1)个查询。出了什么问题?为什么包含不起作用?
答案 0 :(得分:2)
由我解决。
首先,在property_names添加关联has_many :property_values, -> { uniq }, through: :properties
。
之后,我使用此查询:
@property_names = PropertyName.where(id: property_name_ids).where.not(name: PropertyName.description)
.includes(:property_values).where(property_values: { id: property_value_ids }).order('property_values.value')
一切正常!
答案 1 :(得分:0)
您似乎要包含未定义的关联,因为PropertyName
没有定义'property_values'关系。
您可能希望执行以下操作:
PropertyName.includes(properties: :property_value)