这是一个很难解释的问题,因为我真的不知道发生了什么。我制作了一个存储库,其中包含如何重现的说明:
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 中不会发生。
谢谢!