铁路4急切加载沉重的联想

时间:2014-05-19 07:35:00

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我在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)个查询。出了什么问题?为什么包含不起作用?

2 个答案:

答案 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)