我正在尝试同时运行Rails 5和Rails 6,并且在Rails 5 &6个版本的项目共享相同的外部缓存。Rails之后5版本的项目缓存一个ActiveRecord对象,当Rails 6版本从缓存中读取并试图读取cached_object.id
时,它返回nil
。有趣的是,cached_object[:id]
返回正确的值。
我们的缓存实现在底层使用Marshal来序列化/反序列化,所以我可以在不依赖缓存的情况下复制它,如下所示:
给定一个项目运行Rails 5:
usr = User.find_by_id(1)
puts Marshal.dump(usr)
将Marshal.dump
的结果复制并粘贴到另一个运行Rails 6的控制台:
usr = Marshal.load(<COPY_PASTE_STRING>)
usr.id // returns nil
usr[:id] // returns 1
反之似乎不成立。Rails 6中的Marshal.dump
和Rails 5中的Marshal.load
不会复制这个)
有熟悉Rails内部的人知道这里发生了什么吗?
事实证明,这种行为不是Marshal的问题,而是Rails 6中ActiveRecord的变化。