【问题标题】:Undefined local variable or method to_a in Rails?Rails中未定义的局部变量或方法to_a?
【发布时间】:2014-07-01 21:45:47
【问题描述】:

这个函数...

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 中给我一个错误:

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

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

正确的写法是什么?

【问题讨论】:

  • 你在总结什么?
  • 你为什么要把钱存起来? stackoverflow.com/questions/3730019/…
  • @MichalSzyndel:实际上我所有的货币值都保存为decimals 在数据库中。我上面的代码会搞砸吗?
  • 每次你写0.4它都是Ruby中的一个浮点数,所以是的,它会搞砸。如果您必须乘以税值,请使用 BigDecimal.new 来实例化税率。
  • @MichalSzyndel:是的,会的。谢谢你提醒我。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

显然这是现在的做法......

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/

【讨论】:

    【解决方案2】:

    这可行:

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

    但您可能可以在 SQL 中求和(假设 open_amounttax_rate 是您的 invoices 表中的字段):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多