1

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

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(不工作)之间的主要区别是,Marshal.dump(users)在 Rails 3 中调用时,帖子被重新加载:

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 中不会发生。

我希望我能解释得更好,但这是一个晦涩难懂的问题。如果您需要澄清,请提出问题,并查看或克隆 repo。

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

谢谢!

4

1 回答 1

1

此问题已在 Rails master 上修复,一个简单的补丁正在等待 3-2-stable 的审核。我已经在初始化程序中手动应用了补丁,它解决了这个问题。

补丁见这里:https ://github.com/rails/rails/issues/10322#issuecomment-16913855

于 2013-04-24T08:49:39.333 回答