我在我的Rails应用程序(4.1.2)中使用payments.sum(&:price)
。
自从我从Ruby 1.9.3更新到2.1.2后,我收到了这些错误:
wrong number of arguments (1 for 2..3)
这些变体有效:
payments.map(&:price).sum
payments.to_a.sum(&:price)
我是否必须重写我的代码或者我错过了什么? 谢谢!
答案 0 :(得分:18)
总和(*参数)
计算给定列的值之和。返回值 列的数据类型相同,如果没有行,则为0。看到 计算选项的例子。
Person.sum(:age) # => 4562
您的代码似乎应该没有&
:
payments.sum(:price)
答案 1 :(得分:4)
如果您在Rails 4.0中运行此命令,则会收到以下弃用警告:
DEPRECATION警告:不推荐使用块调用#sum 在Rails 4.1中删除。如果要执行总和计算 元素数组,使用'to_a.sum(& block)'。
这是指方法Relation#sum
,当给定一个块时,它先前在Rails 3.2中有效。
正如其他人已经回答的那样,如果price是数据库列,则需要使用payments.sum(:price)
;如果payments.to_a.sum(&:price)
是实例方法,则需要使用price
。
答案 2 :(得分:2)
如果付款是ActiveRecord关联,则可以改为使用ActiveRecord::Calculations sum方法:
payments.sum(:price)
答案 3 :(得分:0)
sum
当你使用它时,是由Rails定义的Enumerable
模块上的方法,而不是Ruby。升级ruby版本不应该有所作为:
http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum
但是,如果您使用它来汇总ActiveRecord上的列,我建议在sum
上使用ActiveRecord::Relation
方法。您可以通过删除&
来执行此操作,正如其他答案所示。
http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum
不同之处在于前者从数据库中获取所有记录,创建对象,在其上调用price
方法并对结果求和。后者使用SUM创建一个SQL语句,这对性能要好得多。