对象可能为零时每个循环的总和

时间:2019-01-01 02:11:07

标签: ruby-on-rails

我正在尝试遍历一组对象(人),并对belongs_to :person的一堆对象的值求和,例如得出一组人不同类型经验的累积年数。

@people.each do |person|

  finance_experience_sum += person.finance_experience.value
  management_experience_sum += person.manangement_experience.value
  clerical_experience_sum += person.clerical_experience.value

end

但是,有时当一个人没有某种经验时,我会收到此错误消息。在每个循环中解决此问题的最简单方法是什么?

  

nil:NilClass的未定义方法“值”

我了解为什么会收到错误,但是不确定在这种情况下克服错误的最简单方法是什么

2 个答案:

答案 0 :(得分:2)

您可以简单地执行这些操作,而无需使用每个循环

finance_experience_sum = People.includes(:finance_experience).sum(:value)
management_experience_sum = People.includes(:manangement_experience).sum(:value)
clerical_experience_sum = People.includes(:clerical_experience).sum(:value)

总是在轨道上使用红宝石最佳实践和预定义的红宝石方法。

答案 1 :(得分:0)

您应遵循最佳做法,例如使用includes包含嵌套记录,以避免N + 1查询问题。

如果您仍然想这样做,请尝试以下操作:

  finance_experience_sum    += person.try(:finance_experience).try(:value).to_i #or to_f if float value
  management_experience_sum += person.try(:manangement_experience).try(:value).to_i
  clerical_experience_sum   += person.try(:clerical_experience).try(:value).to_i

如果您使用的是ruby 2.4或更高版本,请使用:

  finance_experience_sum    += person&.finance_experience&.value&.to_i
  management_experience_sum += person&.manangement_experience&.value&.to_i
  clerical_experience_sum   += person&.clerical_experience&.value&.to_i