Rails/ActiveRecord版本之间的冲突



我正在尝试同时运行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的变化。

相关内容

  • 没有找到相关文章