rails 3.2
Invoice.sum(:amount)
準確返回金額列中所有值的總和。計算給定列的值的總和
如果我做到以下幾點:
invoices = Invoice.all
然後:
invoices.sum(:amount)
我得到以下錯誤:
NoMethodError: undefined method `+'
有沒有辦法做到這一點?
rails 3.2
Invoice.sum(:amount)
準確返回金額列中所有值的總和。計算給定列的值的總和
如果我做到以下幾點:
invoices = Invoice.all
然後:
invoices.sum(:amount)
我得到以下錯誤:
NoMethodError: undefined method `+'
有沒有辦法做到這一點?
你必須使用map
功能,像這樣:
invoices.map(&:amount).sum
如果你確信沒有一個單一的amount == nil
你試過那什麼,應該工作。如果你有一個零列,這將導致 NoMethodError: undefined method '+' for nil
。在這種情況下,你可以做invoices.map(&:amount).compact.sum
或invoices.sum { |i| i.amount || 0 }
這是因爲#sum是一個ActiveRecord方法。它本質上是做的是建立聚集到你的數據庫查詢,像這樣(在SQL):
SELECT SUM(name_of_column_to_sum) FROM table_name;
如果你想返回的值,並將其存儲在一個變量(#ALL),
SELECT * FROM table_name;
然後總結它們,您不再使用ActiveRecord查詢,而是使用ActiveRecord關係(從ActiveRecord查詢返回的類似數組的對象)。所以,那時你需要使用vanilla Ruby來總結。你可以使用#map然後#sum,但是使用#inject會更快更乾淨,就像這樣:
invoices.inject(0){ |sum, invoice| sum + invoice.amount }
我沒有零值,我仍然收到錯誤信息 – EastsideDeveloper