YAML,延迟的工作:精神病与精神病。如何使pysch读取ruby对象的attr_访问器

YAML,延迟的工作:精神病与精神病。如何使pysch读取ruby对象的attr_访问器,yaml,ruby-1.9.3,psych,syck,Yaml,Ruby 1.9.3,Psych,Syck,我在ruby 1.9.3中使用delayed_作业(3.0.3)时遇到问题。之前我们使用的是ruby 1.8.7,它附带了yaml syck解析器,读取为ruby对象设置的所有属性(包括attr_访问器),但升级到1.9.3后,yaml解析器被切换到psych(重新编写),它不考虑除数据库中持久化的属性以外的任何属性。我们如何让psych也考虑属性访问器呢。我尝试切换到syck thru: YAML::ENGINE.yamler = 'syck' 但仍然不起作用 有人对此问题有解决办法吗?上述

我在ruby 1.9.3中使用delayed_作业(3.0.3)时遇到问题。之前我们使用的是ruby 1.8.7,它附带了yaml syck解析器,读取为ruby对象设置的所有属性(包括attr_访问器),但升级到1.9.3后,yaml解析器被切换到psych(重新编写),它不考虑除数据库中持久化的属性以外的任何属性。我们如何让psych也考虑属性访问器呢。我尝试切换到syck thru:

YAML::ENGINE.yamler = 'syck'
但仍然不起作用


有人对此问题有解决办法吗?

上述方法不起作用,但我们只需要用ActiveRecord::Base的方法覆盖encode_和init_,以包含属性访问器。更准确地说,我们需要使用att_访问器设置编码器散列,这将考虑实例变量的持久性


有趣的阅读:

延迟的\u作业反序列化程序不会对加载的ActiveRecord对象调用init\u

下面是一个用于延迟_作业的猴子补丁,它在生成的对象上使用调用init_:

例如,对于那个猴子补丁,若我有一个名为Artwork的模型,带有额外的属性路径和深度:

class Artwork < ActiveRecord::Base
  def encode_with(coder)
    super

    coder['attributes']['path'] = self['path']
    coder['attributes']['depth'] = self['depth']
  end

  def init_with(coder)
    super

    if coder['attributes'].has_key? 'path'
      self['path'] = coder['attributes']['path']
    end

    if coder['attributes'].has_key? 'depth'
      self['depth'] = coder['attributes']['depth']
    end

    self
  end
end
class Artwork