YAML,延迟的工作:精神病与精神病。如何使pysch读取ruby对象的attr_访问器
我在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,延迟的工作:精神病与精神病。如何使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' 但仍然不起作用 有人对此问题有解决办法吗?上述
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