[英]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.