Я добавляю кеширование в свое приложение на Rails, и одна из вещей, которые я делаю, это создание экземпляра модели ActiveRecord с использованием метода .new
(вместо .create
), чтобы он не пытался создать новую строку.
Например, если я добавлю это к моей модели:
def from_json(json)
o = self.new
ActiveSupport::JSON.decode(json).each do |k, v|
# NOTE: I am doing this instead of sending all the params to .new
# because Rails won't let me bulk update protected attributes
o.send(k + '=', v)
end
o
end
, а затем создаю экземпляр объекта из кэша:
o = Foo.from_json(redis.get(key))
Кажется, все работает хорошопока я не попытаюсь изменить поле:
o.bar = "spam and eggs"
o.save
Я получаю исключение, говорящее, что это дублирующая запись.
Как мне сообщить ActiveRecord, что этот факт ссылается на уже существующую строкув базе данных, чтобы он обновлял эту строку вместо броска и исключения?