【问题标题】:Rails sum method returns undefinedRails sum 方法返回未定义
【发布时间】:2016-11-02 21:02:02
【问题描述】:

生成以下错误undefined method +' for #<Debit

控制器动作定义的地方

@debits = Debit.order("vatunitid ASC").where('unit_id = ? AND folio_id = ?', session[:unit_id], @folio.id).to_a
@adhoc_folios = Folio.order("created_at asc").where(['checkout IS NULL AND unit_id = ? AND id != ?', session[:unit_id], @folio.id]).all
@vatunits = Vatunit.where(['unit_id = ?', session[:unit_id]]).to_a
@rates = @debits.map(&:vatunitid).uniq

目前在视图中(用于测试目的)

 @rates.each do |rate| 
   @debits_for_rate = @debits.select{ |i| i.vatunitid == rate } 
   @debits_for_rate.count 
   @debits_for_rate.sum(:amount) 

count 指令返回正确的值
在这一点上,调用 sum 被认为不存在。

这是怎么发生的以及如何克服它?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4.2


    【解决方案1】:

    通过将 AR 转换为数组然后执行 Ruby 操作,而可以使用数据库级计算来代替,您这样做的效率很低。

    但要解决这个特定问题,您应该使用:

    @debits_for_rate.sum(&:amount) 
    

    【讨论】:

    • 以上同意是低效的;一个缓慢的做一个小步骤n验证过程的孩子。解决了
    【解决方案2】:

    因为您的 @debits_for_rate 是一个对象,而不是数字数组。

    @debits_for_rate.sum(&:amount) 否则

    @debits_for_rate.map(&:amount).inject(:+)

    这将为您提取总和。

    【讨论】:

    • 请删除您的答案并使用inject 代码编辑@AndreyDeineko 答案。谢谢
    • @ABPrime 没有必要用inject 编辑我的答案,因为在一个数组上进行单次遍历总是比两个更有效(如这里mapinject):)
    • @AndreyDeineko:同意。
    猜你喜欢
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多