2016-11-30 202 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

而且它会调用sum在SQL数据库中,所以结果得到的查询,例如参数的影响组,加入等

而如果你想使用数组数,就像这里:http://apidock.com/rails/Enumerable/sum

你必须先使你的对象数组,通过to_a

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

但是一般情况下,两者应该产生相同的结果,因为相关的底层参数收集代理的查询在两种情况下都存在,不是吗? –

+0

@DavidAldridge很难说。我有一个例子,虽然它不是我上面写的: 如果您有: '@records = Record.all; @ record.last.cost + = 1' then'@ records.sum(:cost)<@ records.map(&:cost).sum' –