【发布时间】: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