这是一个难以解释的问题,因为我真的不知道发生了什么。我已经建立了一个存储库,其中包含如何重现的说明:
https://github.com/bricker/cache_nested_serialized_attributes
基本上:
并重现:
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 。
谢谢!
答案 0 :(得分:1)
此问题已在Rails主机上修复,simple patch正在等待审核3-2-stable。我已经在初始化程序中手动应用了修补程序,它解决了问题。
请参阅此处查看补丁:https://github.com/rails/rails/issues/10322#issuecomment-16913855