2013-04-24 58 views
1

這是一個難以解釋的難題,因爲我不知道發生了什麼。我做了一個存儲庫如何重現說明:Marshal沒有正確序列化或反序列化嵌套的序列化屬性

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上進行了測試和確認(參見存儲庫)。這種行爲確實發生在而不是中。

+0

好像你並不孤單具有編組AR對象問題:https://github.com/rails/rails/issues/2431。這張票是舊的,'_load'和'_dump'可能已經改變了 - 不幸的是我無法在rails源代碼中找到這些方法。在我看來,您應該嘗試在源代碼中查找方法以查看是否存在問題,並且/或者在rails官方tracker中提出問題 - 對我來說看起來像是一個rails bug! – 2013-04-24 08:13:15

+0

感謝 - '_load'和'_dump'(以及類似的方法'marshal_load'和'marshal_dump')是Ruby核心方法。我認爲這是一個Rails問題,因爲它不會在Rails 4中發生,但它在Rails 3.2中有效。 – bricker 2013-04-24 08:20:10

+0

是的,他們是核心方法,但在這個問題上你可以看到鐵路團隊壓倒了他們。我認爲它在rails 4和不在3.2中工作的原因是方法覆蓋在版本之間已經改變 - 所以找到兩個版本中的方法,查看差異,並且可能修補你自己的類......注:我的壞,你傾銷關係,而不是AR ::基礎對象 - 但我認爲同樣的「錯誤追逐策略」仍然相關 – 2013-04-24 08:26:10

回答

相關問題