rails first_or_create не обновляет существующие записи - PullRequest
0 голосов
/ 23 мая 2018

В связи с этим вопросом эта функция, которую я пишу, обновляет запись.Он просто загружает его.

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

Вывод: 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]]

Запись создается, если она не существует, но просто загружается и не обновляется, если она существует.Что дает?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

first_or_create будет выполнять блок только при создании.Это сделано намеренно, оно позволяет вам устанавливать определенные значения изначально, а не перезаписывать их, когда запись уже существует.

Если вы всегда хотите выполнить блок, вы можете написать его следующим образом:

Blob.where(user_id: user.id, item_id: item.id).first_or_create.tap do |s|
 s.amount += amount
 s.save
end

Или, я предпочитаю более короткую версию

Blob.find_or_create_by(user_id: user.id, item_id: item.id).tap do |s|
 s.amount += amount
 s.save
end
0 голосов
/ 23 мая 2018

Согласно этому документу: https://apidock.com/rails/ActiveRecord/Relation/first_or_create

Ваш блок будет выполняться только в том случае, если запись «Blob» с указанными вами идентификаторами не существует.Блок выполняется только при создании нового экземпляра, а не для существующей записи.

Так что лучше всего сделать что-то вроде этого: -

s = Blob.where(user_id: user.id, item_id: item.id).first_or_create
s.amount += amount
s.save!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...