2013-10-19 57 views
1

我想寫一個方法,它會查找每個價格並將其添加到當前價格。如何將每個價格添加到當前價格?

Quote.rb:

class Quote < ActiveRecord::Base 
    has_many :items 

    def calc_price 
    sum = 0 
    items.each do |item| 
     item.price 
    end 
    sum = (item1 + item2 etc) 
    end 
end 
+3

歡迎堆棧溢出。不管你是新手還是老手,這都不重要。我們關心的是好的問題,並且在你問他們之前是否試圖找出它們。 –

回答

1

以下是關於更多電流紅寶石一個很好的功能:

values = [1,2,3,4,5] 
values.inject(:+) # => 15 

現在,說,你與數據庫的工作,所以有它sum的記錄。從文檔:

計算給定列上的值的總和。如果沒有行,則返回該值的列的相同數據類型爲0。有關選項的示例,請參閱計算。

Person.sum('age') # => 4562 
+0

只是好奇的是,如果我用'.includes(:items)'選項預加載所有引號,那麼對數據庫的求和仍然會發生在數據庫的末尾嗎?我正在思考'Quote.includes(:items).find(:all)' –

+0

我在這裏問了我的關注點的詳細問題http://stackoverflow.com/q/19462427/1860929 一般來說與OP沒有任何關係),直接使用這些方法會是一個推薦的做法嗎? –

0

您需要將.each循環中總結的價格

class Quote < ActiveRecord::Base 
    has_many :items 

    def calc_price 
    sum = 0 
    items.each do |item| 
     sum += item.price 
    end 
    end 
end 

您可以進一步緊湊該循環使用單線

items.each {|item| sum += item.price} 
1

在這種情況下,你可以卸載計算到數據庫。

def total_price 
    items.sum('price') 
end 

參考:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum

+0

只是好奇,如果我用'.includes(:items)'選項預加載所有引號,那麼對數據庫的求和仍然會發生在數據庫的末尾?我正在考慮'Quote.includes(:items).find(:all)'的行。 –

+0

只有在使用'sum'方法時,計算僅發生在數據庫的末尾,'sum'方法將模型屬性作爲參數。所以我不明白爲什麼這與急切的加載有什麼不同。 – depa

+0

急切的加載會在原來的'Quote'對象的同時將相關的'items'對象加載到內存中。我的困惑是,如果對象已經加載到內存中,將使用'sum'對數據庫進行另一個查詢,以便在數據庫結束時進行求和,或者將使用內存對象,在這種情況下,計算不是被卸載到數據庫? –

2
items.inject(0){|sum, item| sum += item.price} 
相關問題