2016-09-16 95 views
1
rails 3.2 

Invoice.sum(:amount) 

準確返回金額列中所有值的總和。計算給定列的值的總和

如果我做到以下幾點:

invoices = Invoice.all 

然後:

invoices.sum(:amount) 

我得到以下錯誤:

NoMethodError: undefined method `+' 

有沒有辦法做到這一點?

回答

1

你必須使用map功能,像這樣:

invoices.map(&:amount).sum 
3

如果你確信沒有一個單一的amount == nil你試過那什麼,應該工作。如果你有一個零列,這將導致 NoMethodError: undefined method '+' for nil。在這種情況下,你可以做invoices.map(&:amount).compact.suminvoices.sum { |i| i.amount || 0 }

+0

我沒有零值,我仍然收到錯誤信息 – EastsideDeveloper

1

這是因爲#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 }