3

我有一个与此类似的问题,只是使用了较新版本的 rails:

Ruby on Rails - 在 ':include =>' 上添加条件以加载有限数量的对象

我想急切加载一个关联,但要限定急切加载中包含的内容。这在rails 3.2中可能吗?我试过了

Foo.includes(:bar).where("bars.col = x")

但这仅限于只有Foo至少有一个Barwhere的 's col = x,而我也想要那些Foo没有Bar's 的 's。我可以创建另一个关联,但随后我失去了发送参数的能力(似乎 :conditions 不能处理带参数的 lambda)。

4

1 回答 1

1

尝试在下一个范围内包含所需的 Foo

Foo.includes(:bar).where("bars.col = x OR bars.id IS NULL")

或者

Foo.includes(:bar).where("bars.col = x AND bars.id IS NULL")

取决于你的需要

所以你可以动态地做,比如

#Foo class
def self.including_bars_equal_to(x) # or scope :including_bars_equal_to, :lambda{|x| ....}
   self.includes(:bar).where("bars.col = ? AND bars.id IS NULL", x)  
end

Attempt2 也许你应该尝试自定义加入和包含

Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.col = 'x'").
includes(:bar)

或者您可以将连接与选择选择相结合

  Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.col = 'x'").
  select("foos.*, bar.id as bar_id, bar.col as bar_col")
于 2013-07-08T21:32:59.093 回答