Ruby on rails rails 4急加载重关联

Ruby on rails rails 4急加载重关联,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我在rails模型之间有关联 有三种模型描述产品特性: 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:

我在rails模型之间有关联

有三种模型描述
产品
特性:

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
我的看法是:

- @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)查询。怎么了?为什么包含不起作用?

您似乎包含了一个未定义的关联,因为
PropertyName
没有定义“property\u values”关系

您可能需要执行以下操作:

 PropertyName.includes(properties: :property_value)
由我来解决

首先,在property\u名称处添加一个关联
有很多:property\u值,->{uniq},通过::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')

一切都好

与您的问题无关。您可以重新考虑您的
代码
PropertyName
PropertyValue
Property
中很像
属性
,而不是
单独的模型
。对我来说这看起来很不合适。@Pavan yes,它可以是一个字符串。但我认为斯芬克斯需要它成为一个模型关联=)我对你的问题进行了大量编辑,试图澄清内容。我仍然很难理解你最后一段想说什么。你能花点时间给我们更新一下吗?我想这会帮助你更快地得到答案。请稍等一会儿不,不行。或者,也许,我需要在视图中指定一些内容?不,没有其他需要在视图中指定的内容。除非您可以更改遍历记录和准备集合的方式。在本例中,我将尝试将查询更改为数据库,这样它将返回唯一的属性值,并按属性名称分组。这样,您的集合将更像您在视图层中使用它所做的事情,并且您肯定会摆脱N+1查询。我在结果中得到该查询:
@property\u name=PropertyName.includes(properties::property\u value)。where(property\u value:{id:@property\u value\u ids})。where(id:property\u name\u ids)。where.not(名称:propertyName.description)。引用(:属性)
在视图中,我写
-@property_names.each do | p|n |…p|n.property_value.each do…
并获得n+1查询!我如何避免这种情况?是的,我可以在您的原始帖子中看到。我的建议是将查询更改为数据库,这样它将返回唯一的property_值,按property_名称分组rtyValue.select('distinct property_values.*')。join('your property name')。where('your conditions')。group('properties.name'))
。然后你迭代组,从中去掉名称,并通过相关组内容构建复选框。我合理地发现了一个错误:
错误:列属性。名称不存在
,因为
属性
表中没有列
名称
。否则问题:你所说的
连接是什么意思('your property names')
?我需要传递一个获取属性名称的变量,或者只使用
连接(:property\u names)
?。其中(property\u值:{id:property\u值\u id})这可以保存我的live。在我的情况下,该条件总是应用于错误的模型。
  @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')