渴望在rails中加载范围内的对象集

时间:2012-08-06 21:50:23

标签: ruby-on-rails-3

我遇到类似这个的问题,只有较新版本的rails:

Ruby on Rails - Add condition on ':include =>' to load limited number of objects

我希望加载一个关联,但要考虑包含在热切加载中的内容。这在轨道3.2中是否可行?我试过了

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

但这仅限于FooBar至少有col = x Foo,而我还要Bar没有{{1}}的{​​{1}} }的。我可以创建另一个关联,但后来我失去了发送参数的能力(似乎不是:条件可以处理带参数的lambda)。

1 个答案:

答案 0 :(得分: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 也许你应该尝试自定义连接和include

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")