Ruby on rails 按关系过滤活动记录,但不按关系本身过滤

Ruby on rails 按关系过滤活动记录,但不按关系本身过滤,ruby-on-rails,activerecord,rails-activerecord,Ruby On Rails,Activerecord,Rails Activerecord,我想用它的关系值过滤一个有很多关系的模型 这可以通过使用Foo.include(:bar).where(bar:{foobar:2})轻松实现 如果我们的数据库中有这样一个对象: { id: 1, bars: [ { id: 4, foobar: 1 }, { id: 5, foobar: 2 } ] } 此查询将仅返回以下内容: { id: 1, bars: [ { id: 5, foobar: 2 } ] } 我仍希望通过此关系筛选我的记录

我想用它的关系值过滤一个有很多关系的模型

这可以通过使用
Foo.include(:bar).where(bar:{foobar:2})
轻松实现

如果我们的数据库中有这样一个对象:

{
  id: 1,
  bars: [
    { id: 4, foobar: 1 },
    { id: 5, foobar: 2 }
  ]
}
此查询将仅返回以下内容:

{
  id: 1,
  bars: [
    { id: 5, foobar: 2 }
  ]
}
我仍希望通过此关系筛选我的记录,但会接收关系中的所有记录

我可以通过使用类似以下内容来实现这一点:
Foo.include(:bar).joins('LEFT JOIN bar AS filtered_bar ON filtered_bar.Foo_id=foos.id')。其中(filtered_bar:{foobar:2})


有更好的方法吗?

这就是
includes
的神奇之处-因为您在其中使用了
,它决定使用左连接,并且不会预加载任何其他内容。您必须在此处明确加入并预选关联:

Foo.joins(:bars).where(bars: {foobar: 2}).uniq.preload(:bars)
不久前,我就这些神奇的方法做了一个演讲,你可以在这里找到: