繁体   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