неопределенный метод '+' для nilClass при использовании first_or_create - PullRequest
0 голосов
/ 21 мая 2018

У меня есть функция, которая использует first_or_create для записи, и мне нужно иметь возможность использовать + для одного из его атрибутов в случае его существования.

Blob.where(user_id: user.id, item_id: item.id).first_or_create do |s|
  s.amount += amount
end

Однако,Я не могу использовать +, если запись не существует.Это проблема синтаксиса или я использую first_or_create?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Выполните нулевую проверку s.amount.Если он не существует ранее, s.amount будет nil, к которому, естественно, нельзя добавить.

Вы можете сделать это, используя следующее.

Blob.where(user_id: user.id, item_id: item.id).first_or_create do |s|
  if s.amount.nil?
    s.amount = amount
  else
    s.amount += amount
  end
end

В качестве альтернативы, вы могли бы установить default из 0 на поле, хотя я не уверен в этом.

0 голосов
/ 21 мая 2018

Блок вызывается только при создании объекта new (один не был найден).Если модель не имеет значения по умолчанию для данного поля, она попытается вызвать + для значения nil.Вы можете сделать что-то вроде этого (возможно, есть более хороший способ):

blob = Blob.where(user_id: user.id, item_id: item.id).first_or_create
blob.amount += amount if blob.amount.present?

В этой ситуации вы можете выполнить sum, только если объект уже существует (что, по-видимому, является вашей целью в соответствии сваше описание).Если вы хотите применить сумму в любой ситуации, вы можете инициализировать сумму до 0, если запись еще не существует:

blob = Blob.where(user_id: user.id, item_id: item.id).first_or_create do |b|
  b.amount = 0
end
blob.amount += amount

В приведенном выше примере, если объект существует, он будетдобавьте amount к текущему значению, иначе он инициализирует атрибут с 0, а затем добавит amount к нему.

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