Rails中未定义的局部变量或方法to_a?

时间:2014-07-01 13:21:26

标签: ruby-on-rails ruby activerecord

这个功能......

class Invoice < ActiveRecord::Base

  def self.open_subtotal
    sum{ |i| i.open_amount / (1.00 + i.tax_rate / 100.00) }
  end

end

...在Rails 4.0.2中给我一个错误:

  

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

当我在to_a之前添加sum时,我收到undefined local variable or method to_a错误。

写这个的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

显然现在是这样做的方式......

select('sum(invoices.open_amount / (1.00 + invoices.tax_rate / 100.00) as open_subtotal')[0][:open_subtotal]

这将在数据库级别进行计算,并附加为新属性open_subtotal,然后从第一个select实例中检索该属性。

取自此博客.. http://stim371.github.io/blog/2014/02/12/deprecating-blocks-on-activerecord-count-and-sum/

答案 1 :(得分:1)

这样可行:

def self.open_subtotal
  all.to_a.sum { |i| i.open_amount / (1.00 + i.tax_rate / 100.00) }
end

但你可以在SQL中总结它(假设open_amounttax_rateinvoices表中的字段:

def self.open_subtotal
  sum("open_amount / (1 + tax_rate / 100)")
end