您好我正在处理一个项目,我必须得到一个活动记录集合的属性的总和。所以我用过:
@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的正确答案
如果有人能帮助我了解这里发生了什么,我们将不胜感激。
答案 0 :(得分: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)
答案 1 :(得分:1)
试试这个:
将attr cost
的值加入数组并汇总其总和
@total = @records.pluck(:cost).sum