Сумма в каждом цикле, когда объект может быть нулем - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь зациклить набор объектов (людей) и суммировать значения группы объектов, которые 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

Однако иногда я получаю эту ошибку, когда у человека нет определенного типа опыта.Какой самый простой способ исправить это в каждом цикле?

неопределенный метод `value 'для nil: NilClass

Я понимаю, почему я получаю ошибку, ноне уверен, что это самый простой способ обойти это в этом сценарии

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вы должны следовать рекомендациям, например включать вложенные записи, используя 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
0 голосов
/ 01 января 2019

Вы можете делать просто так, не используя каждый цикл

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)

Всегда используйте лучшие практики ruby ​​on rails и предопределенные методы ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...