Rails包含在哪里

时间:2015-09-16 15:15:59

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

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

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?如何使其与两个连接一起使用并包括

1 个答案:

答案 0 :(得分:1)

我认为它应该是properties,因为根据CoC,表名是多元化的,请尝试使用properties.property_name代替

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

根据BroiSatse的建议,将.references(:properties)添加到您的查询

希望有所帮助!