我试图加载一些关联,但我想对这里的一些子关系进行过滤是我的意思。
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查询。
实施例
如果我的查询返回带有两个MyModel
记录的单个MyModelDetail
对象。
其中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')
如果我在其中使用includes,则根本不会生成join sql,所以当然这个查询失败了:
"PROPERTY"."PROPERTY_NAME": invalid identifier
为什么,我使用rails 4?如何使其与两个连接一起使用并包括
答案 0 :(得分:1)
我认为它应该是properties
,因为根据CoC,表名是多元化的,请尝试使用properties.property_name
代替
MyModel.includes(my_model_details: [:property, :person]).where('properties.property_name = ?', 'Property name')
根据BroiSatse的建议,将.references(:properties)
添加到您的查询
希望有所帮助!