Ruby on rails 基于带有ActiveRecord中连接的孙子属性选择对象

Ruby on rails 基于带有ActiveRecord中连接的孙子属性选择对象,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,假设我有以下模型: class Foo < ActiveRecord::Base has_many :bars has_many :bazs, :through => :bars class Bar < ActiveRecord::Base belongs_to :foo has_many :bazs class Baz < ActiveRecord::Base belongs_to :bar class Foo:条 类栏

假设我有以下模型:

class Foo < ActiveRecord::Base
has_many :bars
has_many :bazs, :through => :bars

class Bar < ActiveRecord::Base
belongs_to :foo
has_many :bazs

class Baz < ActiveRecord::Base
belongs_to :bar
class Foo:条
类栏
假设Baz有一个“name”属性。对于我来说,选择Baz名称为“x”的所有Foo的最佳方式是什么


我原以为我可以做类似于
Foo.join(:baz.where('baz.name'=>'x')
的事情,但这似乎不起作用

您可以包括声明的关系:

Foo.includes(bars: :bazs)
然后,您可以在包含的表上应用您的条件:


由于您已经通过“has_multi-through”关系在Foo模型中声明了:baz,因此您可以执行以下操作:

Foo.includes(:bazs).where(bazs: { id: 12 })
这应该是工作

Foo.joins(:bazs).where(bazs: {name: 'x'})

我可以发誓我试了几次都没用。再次尝试成功。谢谢也为了其他找到这个的人。。。通过在.group('foos.id')@Patm上加上“
includes
”而不是“
joins
”@MrYoshiji避免重复是的,你是正确的。我检查了这两种方法,在组中使用联接实际上比包含的要快得多。。。至少在我的大样本数据集上是这样。谢谢-但是如果有重孙参与,并且你想浏览另一个表,那么第一个响应会发生什么变化?@BKSpurgeon如果你谈论的是一个自引用关系,有任何深度的话(like Category有很多:child\u categories,每个child\u categories也可以有child,依此类推),然后我强烈建议使用带有递归的SQL
视图
来模拟祖先/后代关系。这将为您节省大量性能。不,这对Rails来说太复杂了,并且涉及一些SQL知识。您可以在Google上轻松找到父/子关系的递归视图示例。
Foo.joins(:bazs).where(bazs: {name: 'x'})