Блок вызывается только при создании объекта 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
к нему.