2009-12-25 67 views
2

在Rails 2.3.5應用我有類似以下型號:優化Rails的預先​​加載查詢找到所有

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

當我打電話

Foo.all(:include => :bars) 

我見在控制檯中進行以下查詢:

SELECT * FROM "foos" 
SELECT "bars".* FROM "bars" WHERE ("bars".foo_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)) 

與where子句中的所有foo的id。

我想這不是一個最佳查詢,而ID的數量可能很大,我需要預加載所有'酒吧'。另外,實際上我沒有兩個模型,但它們是一個鏈。

有沒有一種方法,使預先加載查詢像

SELECT "bars".* FROM "bars" 

當我使用找到所有?

回答

4

這實際上是一種優化,實際上如果id的數量變高,Rails就會改變查詢策略。

你也可以使用:join而是採用:include

+0

看看這裏還有http://akitaonrails.com/2008/5/26/rolling-with-rails-2-1-the-first-關於'Optimized Eager Loading'部分的完整教程 - 第2部分 – khelll 2009-12-25 11:08:02

+0

謝謝,knoopx! 它在我看來,急切的加載一定不知道我是否實際上加載了所有的錶行,或者所有foo的匹配條件(因此,WHERE子句將不包括所有foo的id) 我是現在試圖找出Rails如何改變查詢策略,如果id的數量只是好奇心高的話。 khelll,感謝您的鏈接! – khustochka 2009-12-25 11:26:49