2

Ruby 1.9.3 でdelayed_job (3.0.3) を使用すると問題が発生します。以前は、ruby オブジェクトに設定されたすべての属性 (attr_accessors を含む) を読み取る yaml syck パーサーが付属する ruby​​ 1.8.7 を使用していましたが、1.9.3 へのアップグレードにより、yaml パーサーは psych に切り替えられました (再データベースに永続化されたもの以外の属性は考慮されません。attr_accessors も考慮に入れるようにするにはどうすればよいでしょうか。私はsyckに切り替えようとしました:

YAML::ENGINE.yamler = 'syck'

しかし、まだ機能しません。

この問題の回避策はありますか?

4

2 に答える 2

1

delayd_jobデシリアライザーは、ロードされたActiveRecordオブジェクトに対してinit_withを呼び出しません。

結果のオブジェクトでinit_withを呼び出すdelayed_jobのモンキーパッチは次のとおりです。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 に答える
1

上記のハックは機能しませんが、ActiveRecord::Base の encode_with メソッドと init_with メソッドをオーバーライドして、属性アクセサーを含めるだけで済みます。より正確には、att_accessors を使用してコーダー ハッシュを設定する必要があり、それによってインスタンス変数の永続性が処理されます。

興味深い読み物: https://gist.github.com/3011499

于 2012-11-13T14:27:43.653 に答える