2

我在使用带 ruby​​ 1.9.3 的延迟作业(3.0.3)时遇到问题。以前我们使用的是 ruby​​ 1.8.7,它带有 yaml syck 解析器,它读取为 ruby​​ 对象(包括 attr_accessors)设置的所有属性,但升级到 1.9.3 后,yaml 解析器切换到 psych(重新写的)并且它不考虑除了数据库中持久化的属性之外的任何属性。我们怎样才能让心理也考虑到 attr_accessors。我试图通过以下方式切换到 syck:

YAML::ENGINE.yamler = 'syck'

但还是不行。

有没有人可以解决这个问题?

4

2 回答 2

1

上面的 hack 不起作用,但我们只需要覆盖 ActiveRecord::Base 的 encode_with 和 init_with 方法以包含属性访问器。更准确地说,我们需要使用 att_accessors 设置编码器哈希,这会处理实例变量的持久性。

有趣的阅​​读:https ://gist.github.com/3011499

于 2012-11-13T14:27:43.653 回答
1

delay_job 反序列化器不会在加载的 ActiveRecord 对象上调用 init_with。

这是延迟作业的猴子补丁,它确实在结果对象上调用了 init_with:https ://gist.github.com/4158475

例如,对于那个猴子补丁,如果我有一个名为 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
于 2012-11-28T01:40:22.587 回答