簡體   English   中英

Rails/ActiveRecord 版本之間的元帥沖突

[英]Marshal Conflict between Rails/ActiveRecord versions

我正在嘗試同時運行 Rails 5 和 Rails 6,當項目的 Rails 5 和 6 版本共享相同的外部緩存時遇到了緩存問題。 在 Rails 5 版本的項目緩存了一個 ActiveRecord object 后,當 Rails 6 版本從緩存中讀取並嘗試讀取cached_object.id時,它返回nil 有趣的是, cached_object[:id]返回正確的值。

我們的緩存實現在后台使用 Marshal 進行序列化/反序列化,因此我能夠在沒有緩存依賴的情況下重現它,如下所示:

給定一個運行 Rails 5 的項目:

usr = User.find_by_id(1)
puts Marshal.dump(usr)

Marshal.dump的結果復制並粘貼到另一個運行 Rails 6 的控制台:

usr = Marshal.load(<COPY_PASTE_STRING>)
usr.id // returns nil
usr[:id] // returns 1

相反的情況似乎並不正確(即 Rails 6 中的Marshal.dump和 Rails 5 中的Marshal.load沒有重現這一點)

是否有人熟悉 Rails 內部可能知道這里發生了什么?

事實證明,這種行為不是 Marshal 的問題,而是 Rails 6 中 ActiveRecord 的變化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM