Когда вы сохраняете объект в кеше, объект замораживается. Это одна из причин, по которой вам никогда не следует хранить сложные объекты, такие как модели ActiveRecord.
Когда вы читаете из кэша, объект загружается, но он все еще заморожен. ActiveRecord пытается восстановить состояние объекта, но ему необходимо обновить некоторые внутренние атрибуты. Обновление не будет выполнено, потому что объект заморожен.
Вместо хранения всего объекта, просто сохраните его идентификатор и извлекайте пользователя на лету.
user = User.new
user.login = 'test'
user.save
Rails.cache.write('user:login:test', user.id)
user2 = User.find(Rails.cache.read('user:login:test'))
user2.login = 'test2'
Это немного менее эффективно с точки зрения кэширования, но это путь. Фактически, вы не учитываете, что в это время другие атрибуты пользователя могли быть изменены, и ваш объект больше не представляет текущий статус.
Кроме того, таким образом, ваше хранилище кэша не будет действовать как база данных, и вы сможете хранить больше записей кэша. Идентификаторы занимают меньше памяти, чем весь экземпляр ActiveRecord.
Конечно, вы можете использовать обходной путь #dup
, но это всего лишь уловка. Это не решение. У вас все еще будут проблемы с целостностью кэша, как я объяснил выше.
user = User.new
user.login = 'test'
user.save
Rails.cache.write('user:login:test', user)
user2 = Rails.cache.read('user:login:test').dup
user2.login = 'test2'