这个功能......
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
错误。
写这个的正确方法是什么?
答案 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_amount
和tax_rate
是invoices
表中的字段:
def self.open_subtotal
sum("open_amount / (1 + tax_rate / 100)")
end