与此问题相关,我正在编写的此函数确实会更新记录。它只是加载它。
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)
输出: Blob Load (0.5ms) SELECT "blob".* FROM "blobs" WHERE "blobs"."user_id" = $1 AND "blobs"."item_id" = $2 ORDER BY "blobs"."id" ASC LIMIT $3 [["user_id", 2], ["item_id", 5], ["LIMIT", 1]]
如果记录不存在,则创建该记录,但如果存在则仅加载并且不更新。是什么赋予了?
将first_or_create只能在创建执行块。这是有意为之,它允许您最初设置某些值,而不会在记录已存在时覆盖它们。
如果一直想执行block,可以这样写:
Blob.where(user_id: user.id, item_id: item.id).first_or_create.tap do |s|
s.amount += amount
s.save
end
Run Code Online (Sandbox Code Playgroud)
或者,我更喜欢更短的版本
Blob.find_or_create_by(user_id: user.id, item_id: item.id).tap do |s|
s.amount += amount
s.save
end
Run Code Online (Sandbox Code Playgroud)