使用first_or_create时nilClass的未定义方法“+”

cal*_*eld 1 ruby ruby-on-rails

我有一个在记录上使用的函数first_or_create,并且我需要能够+在它存在的情况下使用它的属性之一。

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

+但是,如果记录不存在,我就无法使用。这是语法问题还是我的使用问题first_or_create

Ale*_*tos 5

仅当创建新对象(尚未找到)时才会调用该块。如果模型没有给定字段的默认值,它将尝试调用+一个nil值。你可以按照这些思路做一些事情(可能有更好的方法):

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

在这种情况下,您仅在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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果一个对象存在,那么它将添加amount到当前值,否则它将初始化属性0,然后添加amount到它。