我遇到类似这个的问题,只有较新版本的rails:
Ruby on Rails - Add condition on ':include =>' to load limited number of objects
我希望加载一个关联,但要考虑包含在热切加载中的内容。这在轨道3.2中是否可行?我试过了
Foo.includes(:bar).where("bars.col = x")
但这仅限于Foo
个Bar
至少有col = x
Foo
,而我还要Bar
没有{{1}}的{{1}} }的。我可以创建另一个关联,但后来我失去了发送参数的能力(似乎不是:条件可以处理带参数的lambda)。
答案 0 :(得分:1)
尝试在下一个
的范围内包含所需的FooFoo.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")