【问题标题】:Rails includes with whereRails 包含 where
【发布时间】:2015-09-16 15:15:58
【问题描述】:

我正在尝试加载一些关联,但我想对一些子关系进行过滤,这就是我的意思。

class MyModel < ActiveRecord::Base
  has_many :my_model_details, dependent: :destroy
end

class MyModelDetails < ActiveRecord::Base
  belongs_to :property
  belongs_to :my_model
  belongs_to :track
  belongs_to :person
end

因此,如果我想获取所有 MyModel 对象,这些对象的详细信息属于具有属性名称的某个属性,我会这样做。

MyModel.includes(my_model_details: [:property, :person]).where('property.property_name = ?', 'Property name')

我想使用includes 而不是joins 的原因是我想将我的模型详细信息按最后一个属性和人名分组。所以我不想在这种情况下触发 N+1 查询。

如果我的查询返回带有两条 MyModelDetail 记录的单个 MyModel 对象。

其中 mymodeldetail id 1 的属性 id 为 1,mymodeldetail id2 的属性 id 为 2。它们都属于同一个人。

所以我会在我的 UI 上显示这个:

MyModel 1
  MyModelDetail 2 - Property name: 'some name' - Person: 'Bob'

现在当我使用包含查询时会发生什么:

MyModel.includes(my_model_details: [:property, :person]).where('property.property_name = ?', 'Property name')

SELECT "MY_MODEL".* FROM "MY_MODEL" WHERE (PROPERTY.PROPERTY_NAME = 'Prop')

如果我在 where 中使用包含,则根本不会生成连接 sql,因此这个查询当然会失败:

"PROPERTY"."PROPERTY_NAME": invalid identifier

为什么,我使用的是 rails 4?我怎样才能使它同时适用于连接和包含

【问题讨论】:

  • 表名不应该是properties吗?无论如何,您需要添加.references(:properties)
  • @BroiSatse 我不知道在哪里可以添加它,你能扩展一下吗,谢谢
  • 可以在where调用后添加。

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


【解决方案1】:

我认为应该是properties,因为根据CoC,表名是复数形式,请尝试改用properties.property_name

MyModel.includes(my_model_details: [:property, :person]).where('properties.property_name = ?', 'Property name')

按照 BroiSatse 的建议,将 .references(:properties) 添加到您的查询中

希望有帮助!

【讨论】:

  • 同样的事情"PROPERTIES"."PROPERTY_NAME": invalid identifier
  • 您是否按照 BroiSatse 的建议添加了 .references`
  • 是的,我做到了,这是 rails 4 的事情还是一直以来都是这样?使用来自my_model_details 的所有字段生成超级巨大的查询,在这种情况下我可能会以left join 查询结束,现在会看到工作。谢谢!请编辑您的答案以包含参考资料,我会接受
  • 这不是 Rails 4 的东西,include 只能这样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多