Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 试图在cequel对象中调用`.to_yaml`时发生SystemStackError_Ruby_Ruby On Rails 4_Cequel_Psychparser - Fatal编程技术网

Ruby 试图在cequel对象中调用`.to_yaml`时发生SystemStackError

Ruby 试图在cequel对象中调用`.to_yaml`时发生SystemStackError,ruby,ruby-on-rails-4,cequel,psychparser,Ruby,Ruby On Rails 4,Cequel,Psychparser,我开始在一个遗留项目中工作,如果我尝试查找cequel记录,然后将其转换为yaml: fj = FullJob.find(1) fj.to_yaml 我得到一个堆栈级别太深的错误。 更深入地检查,定义了一个@record\u collection实例变量,它带来了同一对象的一个副本,在这个副本中,还有同一对象的另一个副本,依此类推……: [7] pry(main)> fj.instance_variables => [:@record_collection, :@cequel_at

我开始在一个遗留项目中工作,如果我尝试查找cequel记录,然后将其转换为yaml:

fj = FullJob.find(1)
fj.to_yaml
我得到一个
堆栈级别太深的
错误。
更深入地检查,定义了一个
@record\u 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, #...
[7]pry(main)>fj.instance\u变量
=>[:@record\u collection,:@cequel\u attributes,:@collection\u proxy,:@loaded,:@persistend]
[8] pry(main)>fj.instance\u variable\u get(:@record\u collection)
=>[#fj.instance_variable_get(:@record_collection)。first.instance_variable_get(:@record_collection)
=> [#
值得一提的是,这只发生在这个特定的模型中

事实上并非如此。我认为这发生在任何先加载然后再加载的记录上——它的
@record\u集合
即使在加载后仍保留在那里(至少,我很容易通过这种方式再现了相同的故障)

cequel
源代码中,我找不到任何一个地方可以删除这个实例变量值(它肯定不会在加载时发生)。另一方面,除了这个延迟加载行为,这个值似乎没有在其他任何地方使用(所以在加载记录后它有点“无用”),因此,使用丑陋的猴子修补方法可能是安全的

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

我很高兴你和我有同样的问题:D。与此同时,我要试试你的猴子补丁,把它作为一个虫子报告给塞克尔,看看我是否有更好的运气。