Если модель изменяет атрибут локально, а затем изменяет его обратно, ActiveRecord не отправляет изменение в БД. Это здорово для производительности, но если что-то еще изменит базу данных, и я хочу вернуть ее к исходному значению, изменение не займет:
model = Model.find(1)
model.update_attribute(:a, 1) # start it off at 1
# some code here that changes model.a to 2
model.a = 2 # I know it changed, reflecting my local model of the change
model.update_attribute(:a, 1) # try change it back, DOESN'T WORK
Последняя строка не работает, потому что AR думает, что в БД он все еще равен 1, хотя что-то еще изменило его на 2. Как я могу принудительно обновить AR или обновить кэш напрямую, если я знаю новое значение? 1004 *
Примечание: код, который изменяет это запрос update_all, блокирует запись, но имеет побочные эффекты, которые портят кэш. Несколько машин читают эту таблицу. Если есть лучший способ сделать это, я хотел бы знать.
Model.update_all(["locked_by = ?", lock_name], ["id = ? AND locked_by IS NULL", id])