【问题标题】:Marshal Conflict between Rails/ActiveRecord versionsRails/ActiveRecord 版本之间的元帅冲突
【发布时间】: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 内部结构的人知道这里发生了什么吗?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-5 marshalling ruby-on-rails-6


【解决方案1】:

事实证明,这种行为不是 Marshal 的问题,而是 Rails 6 中 ActiveRecord 中的 change

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2022-01-03
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多