积极的记录总和给出了错误的答案

时间:2016-11-30 13:52:18

标签: ruby-on-rails ruby

您好我正在处理一个项目,我必须得到一个活动记录集合的属性的总和。所以我用过:

@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的正确答案

如果有人能帮助我了解这里发生了什么,我们将不胜感激。

2 个答案:

答案 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
相关问题