2011-04-14 105 views
1

我在加載相關記錄時遇到了一些奇怪的行爲。我已經在「includes」中指定了需要的關係,並且所有的東西都被加載了四個查詢。但是,當我遍歷選定的記錄時,Rails開始爲每個相關實體發出一個查詢,大部分時間點擊緩存。我無法在類似設置的測試應用程序中重現此問題。以下是代碼的相關部分:在Rails中急切加載的問題

class Side < ActiveRecord::Base 
    belongs_to :photo 
    belongs_to :board 
end 

class Board < ActiveRecord::Base 
    belongs_to :address 
    has_many :sides 
end 

class Photo < ActiveRecord::Base 
    has_many :sides 
end 

class Address < ActiveRecord::Base 
    belongs_to :city 
    has_many :boards 
end 

class City < ActiveRecord::Base 
    has_many :addresses 
end 

q = Side.includes({:board => :address}, :photo).joins({:board => :address}, :projects).limit(50) 
q.each {|s| s.photo} 

聯接用於稍後添加謂詞。

回答

0

我相信這是因爲軌道是'延遲加載'的方式 - 所以你撥打Side.includes(...).limit(50)你實際上沒有請求任何記錄。把它想象成在模型上設置一個scope

我懷疑如果你添加.all到最後它會加載記錄在一個查詢中。

+0

當我開始迭代時,Rails加載所有記錄。 – synapse 2011-04-17 10:31:41

+0

你在視圖中調用了哪些屬性? – 2011-04-17 12:36:33

+0

也許值得設置子彈。它會警告你什麼時候應該/不應該使用急切的加載... https://github.com/flyerhzm/bullet – 2011-04-17 13:12:43