sum(&:x)不再工作了

Rai*_*ana 16 ruby sum ruby-on-rails-4

payments.sum(&:price)在我的Rails应用程序(4.1.2)中使用.自从我从Ruby 1.9.3更新到2.1.2后,我收到了以下错误:

wrong number of arguments (1 for 2..3)
Run Code Online (Sandbox Code Playgroud)

这些变体有效:

payments.map(&:price).sum
payments.to_a.sum(&:price)
Run Code Online (Sandbox Code Playgroud)

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

Uri*_*ssi 18

文档:

SUM(*参数)

计算给定列的值的总和.返回的值与列的数据类型相同,如果没有行,则返回0.有关选项,请参阅计算示例.

Person.sum(:age) # => 4562
Run Code Online (Sandbox Code Playgroud)

看来你的代码应该没有&:

payments.sum(:price)
Run Code Online (Sandbox Code Playgroud)

  • @Sean如果你不使用[rails](http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum),你可以简单地使用经典[`inject`](http:// ruby-doc.org/core-2.1.2/Enumerable.html#method-i-inject),如下所示:`payments.map(&:price).inject(:+)` (3认同)

小智 6

如果您在 Rails 4.0 中运行过它,您将收到以下弃用警告:

弃用警告:不推荐使用块调用 #sum 并将在 Rails 4.1 中删除。如果要对元素数组执行总和计算,请使用“to_a.sum(&block)”。

这是指方法 Relation#sum在给定块时以前在 Rails 3.2 中工作。

正如其他人所回答的那样,您要么需要使用payments.sum(:price)if price 是数据库列,要么使用payments.to_a.sum(&:price)ifprice是一个实例方法。