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

时间:2018-05-20 21:33:54

标签: ruby-on-rails ruby

我有一个在记录上使用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 :(得分:4)

只有在创建对象时才会调用该块(尚未找到一个)。如果模型没有给定字段的默认值,它将尝试在+值上调用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。< / p>

答案 1 :(得分:1)

对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,但我对该字段不肯定。