2016-09-16 22 views
1
rails 3.2 

Invoice.sum(:amount) 

amount列のすべての値の合計を正確に返します。その後、与えられた列の値の合計を計算する

invoices = Invoice.all 

そして:私は次の操作を行う場合は

invoices.sum(:amount) 

私は次のエラーを取得:これを行う方法は

NoMethodError: undefined method `+' 

ありますか?あなたはこのように、map機能を使用する必要が

答えて

1

invoices.map(&:amount).sum 
3

あなたは、単一のamount == nilはあなたがしようとしたものをそこではないことが確実な場合は、動作するはずです。単一のnil列がある場合は、 NoMethodError: undefined method '+' for nilとなります。この場合、どちらでもかまいませんinvoices.map(&:amount).compact.sumまたはinvoices.sum { |i| i.amount || 0 }

+0

:あなたは#map、その後#sumを使用することができますが、それはそうのように、より速く、ちょうど#injectを使用してきれいになります – EastsideDeveloper

1

これは#sumがActiveRecordメソッドであるためです。あなたが値を返すと、変数(#ALL)に保存したい場合は、

SELECT SUM(name_of_column_to_sum) FROM table_name; 

SELECT * FROM table_name; 
:何それは、本質的にやっていることはそれほど(SQLで)のようなデータベースクエリへの集約を構築しています

とTHENを合計すると、ActiveRecordクエリではなく、ActiveRecordクエリ(ActiveRecordクエリから返される配列のようなオブジェクト)で処理されます。だから、その時点でバニラ・ルビーを使って集計する必要があります。私はゼロの値を持っていないし、私はまだエラーメッセージが表示されます

invoices.inject(0){ |sum, invoice| sum + invoice.amount } 
関連する問題