给定这样的示例模型:
class Foo < ActiveRecord::Base
belongs_to :bar
end
class Bar < ActiveRecord::Base
has_many :foos
belongs_to :baz
end
class Baz < ActiveRecord::Base
has_many :bars
belongs_to :qux
end
class Qux < ActiveRecord::Base
resourcify
has_many :bazzes
end
以下代码按预期工作:
records = Foo.joins(bar: { baz: :qux }).merge(Qux.where(x: 17))
然而
records = Foo.joins(bar: { baz: :qux }).merge(Qux.with_role(:admin))
返回Foo
已使用表中的值填充的记录集合quxxes
。这意味着例如records.z
where z
is a column on foos
but not onquxxes
将给出缺少属性的错误。您几乎可以通过以下方式解决此问题:
records = Foo.select('foos.*').joins(bar: { baz: :qux }).merge(Qux.with_role(:admin))
但这是具有欺骗性的,因为它会从列中获取值,而不是quxxes
从foos
具有相同名称的列中获取值,例如id
, created_at
,并且updated_at
在典型的 Rails 应用程序中将来自quxxes
。