rails first_or_create 不更新现有记录

cal*_*eld 0 ruby-on-rails

与此问题相关,我正在编写的此函数确实会更新记录。它只是加载它。

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]]

如果记录不存在,则创建该记录,但如果存在则仅加载并且不更新。是什么赋予了?

nat*_*vda 6

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)