我想寫一個方法,它會查找每個價格並將其添加到當前價格。如何將每個價格添加到當前價格?
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
我想寫一個方法,它會查找每個價格並將其添加到當前價格。如何將每個價格添加到當前價格?
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
以下是關於更多電流紅寶石一個很好的功能:
values = [1,2,3,4,5]
values.inject(:+) # => 15
現在,說,你與數據庫的工作,所以有它sum
的記錄。從文檔:
計算給定列上的值的總和。如果沒有行,則返回該值的列的相同數據類型爲0。有關選項的示例,請參閱計算。
Person.sum('age') # => 4562
只是好奇的是,如果我用'.includes(:items)'選項預加載所有引號,那麼對數據庫的求和仍然會發生在數據庫的末尾嗎?我正在思考'Quote.includes(:items).find(:all)' –
我在這裏問了我的關注點的詳細問題http://stackoverflow.com/q/19462427/1860929 一般來說與OP沒有任何關係),直接使用這些方法會是一個推薦的做法嗎? –
您需要將.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}
怎麼樣
items.map(&:price).inject(0, :+)
地圖部分將items數組映射到價格數組,並且注入部分以0開始並添加價格數組的每個元素。
在這種情況下,你可以卸載計算到數據庫。
def total_price
items.sum('price')
end
參考:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum
只是好奇,如果我用'.includes(:items)'選項預加載所有引號,那麼對數據庫的求和仍然會發生在數據庫的末尾?我正在考慮'Quote.includes(:items).find(:all)'的行。 –
只有在使用'sum'方法時,計算僅發生在數據庫的末尾,'sum'方法將模型屬性作爲參數。所以我不明白爲什麼這與急切的加載有什麼不同。 – depa
急切的加載會在原來的'Quote'對象的同時將相關的'items'對象加載到內存中。我的困惑是,如果對象已經加載到內存中,將使用'sum'對數據庫進行另一個查詢,以便在數據庫結束時進行求和,或者將使用內存對象,在這種情況下,計算不是被卸載到數據庫? –
items.inject(0){|sum, item| sum += item.price}
歡迎堆棧溢出。不管你是新手還是老手,這都不重要。我們關心的是好的問題,並且在你問他們之前是否試圖找出它們。 –