我有一个在记录上使用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
?
答案 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,但我对该字段不肯定。