Rails 包括 with where

Gan*_*row 2 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
Run Code Online (Sandbox Code Playgroud)

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

MyModel.includes(my_model_details: [:property, :person]).where('property.property_name = ?', 'Property name')
Run Code Online (Sandbox Code Playgroud)

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

前任

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

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

所以在我的用户界面上我会显示这个:

MyModel 1
  MyModelDetail 2 - Property name: 'some name' - Person: 'Bob'
Run Code Online (Sandbox Code Playgroud)

现在,当我使用包含查询时会发生以下情况:

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

SELECT "MY_MODEL".* FROM "MY_MODEL" WHERE (PROPERTY.PROPERTY_NAME = 'Prop')
Run Code Online (Sandbox Code Playgroud)

如果我将 include 与 where 一起使用,则根本不会生成 join sql,因此该查询当然会失败:

"PROPERTY"."PROPERTY_NAME": invalid identifier
Run Code Online (Sandbox Code Playgroud)

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

Raj*_*ngh 5

我认为应该是properties,因为表名根据CoC是复数的,尝试properties.property_name使用

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

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

希望有帮助!