我正在尝试遍历一组对象(人),并对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的未定义方法“值”
我了解为什么会收到错误,但是不确定在这种情况下克服错误的最简单方法是什么
答案 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