2013-10-19 22 views
2

我的困惑來自this question,其中OP有一個像做ActiveRecord ::計算與急切加載使多個數據庫查詢?

class Quote < ActiveRecord::Base 
    has_many :items 
    def calc_price 
    sum = 0 
    #logic for summation 
    end 
end 

在回答模型莖,一對夫婦的人建議直接使用數總和法計算屬性的總和

def total_price 
    items.sum('price') 
end 

如果我急於使用Quote.includes(:items).find(:all)加載數據,數據庫的結尾是否發生,還是使用已經加載到內存中的對象?如果它使用已經加載到內存中的對象,那麼計算不會被卸載到數據庫。

它會使數據庫查詢兩次,一次預加載,然後總結價格?

將相同的邏輯擴展到全部ActiveRecord::Calculations,如果我做了countaverage或其他類似的方法,我會每次打我的數據庫嗎?

回答

3

ActiveRecord::Calculations(包括sumcountaverage)將訪問數據庫,即使項目都渴望加載。對於例如

quotes = Quote.includes(:items).find(:all) 
# two queries one to fetch quotes and one to fetch all associated items 

items = quotes.first.items 
# no query as items are eager loaded 

total_price = quotes.first.items.sum(:price) 
# one query to get sum of item prices for the first quote 
# summation is done by the database 

要檢查此問題,請運行rails控制檯並使用ActiveRecord::Base.logger = Logger.new(STDOUT)登錄到控制檯。然後你可以看到每個方法正在做什麼db查詢。

+4

重要的是,如果它只是爲了求和而擊中數據庫,那就是一次命中將返回一個值。與其他任何你可以做的事情相比,速度非常快,並且可能比迭代內存中的數據更快。 –