Ruby on rails 从YAML加载ActiveRecord对象时出现反序列化错误
为什么在尝试反序列化新ActiveRecord对象时会出现此错误:Ruby on rails 从YAML加载ActiveRecord对象时出现反序列化错误,ruby-on-rails,ruby,ruby-on-rails-3,yaml,delayed-job,Ruby On Rails,Ruby,Ruby On Rails 3,Yaml,Delayed Job,为什么在尝试反序列化新ActiveRecord对象时会出现此错误: [Dev]> YAML.load(Identity.new.to_yaml) Delayed::DeserializationError: Delayed::DeserializationError 同时,此示例使用现有AR对象时,效果与预期一致: [Dev]> YAML.load(Identity.first.to_yaml) => #<Identity id: 1, ... [Dev]>YAML.
[Dev]> YAML.load(Identity.new.to_yaml)
Delayed::DeserializationError: Delayed::DeserializationError
同时,此示例使用现有AR对象时,效果与预期一致:
[Dev]> YAML.load(Identity.first.to_yaml)
=> #<Identity id: 1, ...
[Dev]>YAML.load(Identity.first.to_YAML)
=>#原因是,如果你检查延迟的作业结构,存在一个名为
现在对于Ruby withsyck
(只有syck才会出现)作为YAML引擎,每次调用YAML.load
时,defineYAML\u new
都会被调用,如果从技术上检查该方法,它会尝试使用从对象属性中提取的id
从数据库中构建对象
那么对于这个
YAML.load(Identity.first.to_YAML)
它内部就是这样做的
Identity.find(1)
但是在你的例子中,Identity.new
作为noid
与之关联,因此这是一种反序列化
我认为人们花了这么长时间来回答这个问题的原因是您列出的错误
Delayed::反序列化错误:Delayed::反序列化错误
因为它确实说明了任何信息,说明它确实存在主
键
我认为原因是提交可能,它或多或少是在您发布问题的同时推送的,但可能您仍然在您的机器中使用旧代码,但今年没有报告它
ActiveRecord::RecordNotFound, class: #{klass} , primary key: #{val['attributes'][klass.primary_key]}
注:
它只发生在syck
测试出的pysch
中,该方法根本没有被调用,我想可能是为了向后兼容