在控制器问题中求和

时间:2013-09-24 03:42:28

标签: ruby-on-rails ruby ruby-on-rails-2

当我试图做一个条件并总结我的其他专栏

时,我收到了一个错误
@dolars =Policy.find(:all ,:conditions=>"type_money = '1' ").sum(&:amount_ensure)

我的表

Policies 
    |id|  |type_money| |amount_ensure|
   integer   integer     integer 

我的日志显示了这个

nil can't be coerced into Fixnum
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in `+'
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/core_ext/enumerable.rb:61:in `sum'
.rvm/gems/ruby-1.8.7-p370/gems/activerecord-2.3.5/lib/active_record/attribute_methods.rb:211:in `inject'
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/core_ext/enumerable.rb:61:in `each'
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/core_ext/enumerable.rb:61:in `inject'
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/core_ext/enumerable.rb:61:in `sum'
.rvm/gems/ruby-1.8.7-p370/gems/activesupport-2.3.5/lib/active_support/core_ext/enumerable.rb:59:in `sum'

我正在尝试这样做:

SELECT id, SUM(amount_ensure) As dolars,type_money
FROM Policies
WHERE type_money= "1"

我的控制器中的代码应该可以工作,但我不知道发生了什么

有人可以帮帮我吗?我将非常感谢所有的帮助

3 个答案:

答案 0 :(得分:2)

使用此

 @dolars = Policy.sum(:amount_ensure ,:conditions=>"type_money = '1' ")

以上查询在sql本身执行求和

sum之后调用find时,它会对从查询中提取的记录求和。

答案 1 :(得分:1)

某个地方nil的值为#amount_ensure

也许这会在irb

中更清晰
2.0.0p195 :001 > [1,2,3,4,nil].reduce(&:+)
TypeError: nil can't be coerced into Fixnum
    from (irb):1:in `+'
    from (irb):1:in `each'
    from (irb):1:in `reduce'
    from (irb):1
    from /Users/nick/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in `<main>'

答案 2 :(得分:1)

尝试使用inject方法,你也可以强制转换.to_f,以便将nils清零。

@dolars =Policy.where(:type_money => 1).inject(0) { |sum, policy| sum += policy.amount_ensure.to_f }
相关问题