【发布时间】:2021-02-06 19:56:10
【问题描述】:
我正在尝试同时运行 Rails 5 和 Rails 6,但当项目的 Rails 5 和 6 版本共享相同的外部缓存时,我遇到了缓存问题。铁轨之后
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 内部结构的人知道这里发生了什么吗?
【问题讨论】:
-
感谢您的提问和回答!我在这里提出了一个 Rails 问题:github.com/rails/rails/issues/43582
标签: ruby-on-rails ruby ruby-on-rails-5 marshalling ruby-on-rails-6