Marshal没有正确地序列化或反序列化嵌套的序列化属性

时间:2013-04-24 07:10:50

标签: ruby-on-rails ruby ruby-on-rails-3

这是一个难以解释的问题,因为我真的不知道发生了什么。我已经建立了一个存储库,其中包含如何重现的说明:

https://github.com/bricker/cache_nested_serialized_attributes

基本上:

  • 用户has_many帖子
  • 发布了序列化属性:元数据

并重现:

users = User.first(2)
users.first.posts.first
users.last.posts.first
dump = Marshal.dump(users)
Marshal.load(dump)
=> [#<User id: 1, name: "bricker", created_at: "2013-04-24 06:26:03", updated_at: "2013-04-24 06:26:03">, 
    :@new_record]

您可以在最后一行中看到意外的输出。它似乎只在这些特定条件下发生。只需拨打users.first.posts即可。一点也不打电话.posts。只有当我在转储之前从用户加载特定帖子时才会发生这种情况。

我注意到Rails 4(运行正常)和Rails 3.2.13(不起作用)之间的主要区别在于,当在Rails 3中调用Marshal.dump(users)时,会重新加载帖子:

dump = Marshal.dump(users)
  Post Load (0.2ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = 1
  Post Load (0.2ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = 2

......在Rails 4中没有发生。

我希望我能更好地解释,但这是一个如此模糊的问题。如果您需要澄清,请提出问题,并查看或克隆回购。

这是在vanilla Rails 3.2.13上测试和确认的(参见存储库)。这种行为在Rails 4中发生 not

谢谢!

1 个答案:

答案 0 :(得分:1)

此问题已在Rails主机上修复,simple patch正在等待审核3-2-stable。我已经在初始化程序中手动应用了修补程序,它解决了问题。

请参阅此处查看补丁:https://github.com/rails/rails/issues/10322#issuecomment-16913855