2016-11-30 10 views
0

こんにちは私はプロジェクトに取り組んでおり、アクティブレコードコレクションの属性の合計を取得する必要があります。だから私は使用:間違った答えを返すアクティブなレコードの合計

@total = @records.sum(:cost) 

を私が持っている場合は、これは例えば、間違った値を与える:

@records.each{ |x| puts x.cost} 

私は118.80と108.00

を得るが、@totalのために、私はこれは明らかに、680.40を取得します私が使用している場合しかし、答えではありません。

@total = 0 
@records.each{ |x| @total = @total + x.cost} 

私は226.80

01の右の答えを得ます

誰でも私がここで何が起こっているのか理解するのを助けることができれば、非常に感謝しています。

+1

680.40 = 226.80 * 3それが何らかの形で役立ちます。しかし、問題はあなたが私たちに示したコードではありません。 – ndn

+0

@ records.pluck(:cost).sum –

+1

'@ records'はどのように定義されていますか? – spickermann

答えて

1

はこれを試してみてください。

は、配列にattrのcostの値を摘み取ると

@total = @records.pluck(:cost).sum 
+0

これは正解ですが、私の元のコードはなぜ機能しませんでしたか? – user2320239

+0

なぜ 'sum'が同じで速い場合に' pluck' + 'sum'を使うのですか?私はあなたの答えを編集した、あなたは編集を元に戻した。 –

+0

@AndreyDeineko明らかに.. '@ records.sum(:cost)'は '@ records'のオブジェクトだけでなく、そのテーブルのすべてのレコードの合計を返します同様の問題は以前のruby 2.3.0、rails 4.2.7と同じ問題です。)OPは間違った答えで '@ records.sum(:cost)'を試しました – sa77

3

それらの和を集約レコードコレクションがActiveRecord::Associations::CollectionProxyのインスタンスではなく、Arrayあるとして、注意してください。実際に呼び出されるものをこの方法で

@object.collection.sum(:cost) 

http://apidock.com/rails/v4.2.7/ActiveRecord/Calculations/sum

そして結果は、クエリのパラメータの影響を受けますので、それは例えば、SQLデータベースにsumを呼び出します。それはあなたが呼び出す場合ことを意味しhttp://apidock.com/rails/Enumerable/sum

あなたはto_aを経て、最初にあなたのオブジェクトの配列を作成する必要があります:あなたがここにあるように、アレイの合計を使用したい場合は一方のグループなど、

に参加し

@object.collection.to_a.sum(&:cost) 
+0

しかし、一般に、2つの結果は、コレクションプロキシのクエリは両方の場合に存在しますが、いいえ? –

+0

@DavidAldridge難しいと言います。私はこれが真実でない例を持っていますが、これは私が上に書いたものではありません。 あなたが持っているもの: '@records = Record.all; @ record.last.cost + = 1' それから '@ records.sum(:cost)<@ records.map(&:cost).sum' –

関連する問題