sum(&:x)不再工作了

时间:2014-06-30 19:44:58

标签: ruby ruby-on-rails-4 sum

我在我的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)

我是否必须重写我的代码或者我错过了什么? 谢谢!

4 个答案:

答案 0 :(得分:18)

来自documentation

  

总和(*参数)

     

计算给定列的值之和。返回值   列的数据类型相同,如果没有行,则为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语句,这对性能要好得多。