有效的记录总和给出了错误的答案
嗨我正在一个项目,我必须得到一个活跃的记录集合的属性的总和。所以我用:有效的记录总和给出了错误的答案
@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正确的答案如果任何人都可以帮助我理解这里发生了什么,将不胜感激。
试试这个:
采摘ATTR cost
的值到一个数组并聚集它们的总和
@total = @records.pluck(:cost).sum
这给出了正确的答案,为什么我的原始代码不起作用? – user2320239
为什么'sum''使用'pluck' +'sum'的时候速度一样快?我编辑了你的答案,你还原了编辑.. –
@AndreyDeineko显然..'@ records.sum(:cost)'给我表中所有记录的总和,而不仅仅是'@ records'中的对象类似的问题早些时候用ruby 2.3.0,rails 4.2.7).OP已经尝试了@ @ records.sum(:cost)',并且回答了错误 – sa77
要小心,因为一个记录集是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)
但是一般情况下,两者应该产生相同的结果,因为相关的底层参数收集代理的查询在两种情况下都存在,不是吗? –
@DavidAldridge很难说。我有一个例子,虽然它不是我上面写的: 如果您有: '@records = Record.all; @ record.last.cost + = 1' then'@ records.sum(:cost)
680.40 = 226.80 * 3如果有帮助的话。但问题不在于您向我们显示的代码。 – ndn
@ records.pluck(:cost).sum –
如何定义“@ records”? – spickermann