试图获得一个总数 - Ruby

时间:2016-03-16 06:59:53

标签: ruby-on-rails ruby

我试图在我的一个名为" upgrade_cost"的字段中获得总费用。并将其存储在名为$ tuc

的变量中
  def totalUpgradeCost
    $e = Experience.all
      $tuc = 0
      (e.emf_assets).each do |i|
        i.upgrade_cost += $tuc
      end
    return $tuc
  end

我得到一些错误未定义的局部变量或方法`e',新的ruby。有人帮忙吗?

3 个答案:

答案 0 :(得分:1)

我假设emf_assets与经验相关联(通过has_many)。这就是说我认为以下内容对您有用:

def total_upgrade_cost
  total = 0                               # use a more descriptive variable names
  all_experiences = Experience.all        

  all_experiences.each do |experience|    # iterate over each `experiment`
    experience.emf_assets.each do |asset| # load `emf_assets` for each `experiment`

      # add the `upgrade_cost` (which might be `nil`) to `total`
      total += asset.upgrade_cost.to_i    
    end
  end

  total                                   # no need for an explicit `return`
end

请注意,这可能适用于较小数量的experiencesemf_assets,但在下一步中,性能将受益于某些优化。但我认为目前优化不属于这个问题的范围。您将需要避免N + 1查询问题,并且在数据库中执行整个计算可能是有意义的。

答案 1 :(得分:0)

e中的e.emf_assets是什么?如果您的意思是$e,则不允许您放弃$。在Ruby中,变量名称开头的$表示全局变量。如果您还没有在此功能之外使用$e,最好简单地称它为e,这样它就不会在函数外部显示出来。无论如何,您都会收到错误,因为$e表示全局,e表示单独的(未定义的)本地变量。

答案 2 :(得分:-2)

这不是PHP。到处都不需要$个标志。您已使用$一个e并将另一个留空,这就是错误原因。

此代码应该有效:

def totalUpgradeCost
  e = Experience.all
  tuc = 0
  e.emf_assets.each do |i|
    tuc += i.upgrade_cost
  end

  return tuc
end

这可以用更短的方式实现:

def totalUpgradeCost
  e = Experience.all
  e.emf_assets.inject(0) {|sum, i| sum += i.upgrade_cost}
end