2012-08-06 52 views
3

我有類似這樣的問題設置對象的,只能用鋼軌的較新版本:渴望負載作用域確定在軌

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 s左右,而我也希望這些Foo的,沒有Bar的。我可以創建另一個關聯,但是我失去了發送參數的能力(看起來不像:條件可以用參數處理lambda表達式)。到包括需要

+0

加入我不能完全肯定,但我認爲我的這個問題,其他可能更準確地說你要找的@ user1158559:http://stackoverflow.com/questions/15691558/refining-the-inner-join-when-using-includes-in-activerecord。我在學習了更多關於軌道的問題後問了這個問題。這也沒有答案 – spike 2013-07-09 04:39:27

+0

你是對的。可能需要再打另一個50代表!謝謝! – user1158559 2013-07-09 13:52:55

+0

我給我的其他(國際海事組織更好)的問題增加了一個賞金。 – spike 2013-07-12 15:02:08

回答

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

很好的答案,但不完全。這將產生'SELECT foos。*,bars。* FROM foos LEFT OUTER JOIN bars ON bars.foo_id = foos.id WHERE bars.col = x OR bars.id IS NULL',而我希望'SELECT foos。*,bars 。* FROM foos LEFT OUTER JOIN bars on bars.foo_id = foos.id AND bars.col = x'。不同之處在於,你的查詢不會返回有'bar'且'col'不等於x的'foo'的行,而我的行將只有'foo'出現。 – user1158559 2013-07-08 23:34:59

+0

@ user1158559,see our update pls – Fivell 2013-07-10 07:56:08

+0

不,對不起,您的答案仍然排除行與foos行關聯的一個或多個酒吧行所有col <> x。結果中'foos'的總數會有所不同。 – user1158559 2013-07-10 10:13:55