簡體   English   中英

SystemStackError 嘗試在 cequel 對象中調用 `.to_yaml`

[英]SystemStackError trying to call `.to_yaml` in a cequel object

我開始在一個遺留項目中工作,如果我嘗試查找 cequel 記錄然后將其轉換為 yaml:

fj = FullJob.find(1)
fj.to_yaml

我收到stack level too deep錯誤。 更深入地檢查, 在 cequel record 中定義一個@record_collection實例變量,它帶來了相同對象的副本,在此內部,另一個副本等等......:

[7] pry(main)> fj.instance_variables
=> [:@record_collection, :@cequel_attributes, :@collection_proxies, :@loaded, :@persisted]
[8] pry(main)> fj.instance_variable_get(:@record_collection)
=> [#<FullJob id: 1, #...
[9] pry(main)> fj.instance_variable_get(:@record_collection).first.instance_variable_get(:@record_collection)
=> [#<FullJob id: 1, #...

問題是,ruby yaml 解析器在某些時候嘗試解析對象的所有實例變量,最終派生在提到的SystemStackError
值得一提的是,這只發生在這個特定模型中,我的意思是,據我@record_collection@record_collection變量對於這個項目中存在的另一個 cequel 模型nil
完全不確定這是如何工作的,如果這是一個 cequel 錯誤或模型中沒有正確配置的東西,但是......可能與 cequel 延遲加載有關?,無論如何我在這里沒有想法:(

值得一提的是,這只發生在這個特定的模型中

其實不是。 我認為任何先懶惰地實例化為“卸載”然后再加載的記錄都會發生這種情況-即使加載后它的@record_collection仍然保留在那里(至少,我很容易以這種方式重現了相同的失敗)。

我在cequel源代碼中找不到任何地方刪除此實例變量值(它肯定不會在加載時發生)。 另一方面,除了這種延遲加載行為之外,這個值似乎沒有在其他任何地方使用(因此在加載記錄后它有點“無用”),因此使用丑陋的猴子修補解決方法助手可能是安全的

def cequel_to_yaml(record)
  record.load unless record.loaded?
  record.instance_variable_set(:@record_collection, nil)
  record.to_yaml
end

暫無
暫無

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

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