2

私のモデルにいくつかの機能を追加するために、デコレータ クラスを使用しています。この情報を使用して一部の値を処理したいだけで、データベースに何も保存したくありません。

次のようなデコレータクラスがあります。

class Deco

   def initialize o
     @target = o
   end
   def method_missing method, *args, &block
     @target.send(method, *args, &block)
   end
   #my extra methods
end

そして、私はそれを次のように使用します:

deco_model = Deco.new(model)

ここで問題があるのは、これdeco_modeを別のものに関連付けたいときに、型の不一致エラーが発生することです。これは理にかなっていますが、デコレータ クラスに次のメソッドを追加すると、次のようになります。

def class
   @target.class
end

それでも同じエラーが発生しますが、次のように表示されます: Model(#aaaaaa) expected, got Model(#aaaaaa) はい、「モデル」はモデルのクラスであり、オブジェクト ID はどちらの場合も同じです.. . オブジェクト ID が同じであるのに、なぜまだ例外が発生するのでしょうか?

ありがとう

4

1 に答える 1

5

is_a?内部で使用されているメソッドも上書きする必要があったことがわかりましたActiveRecord::Associaions::Association

実行後:

def is_a? klass
  @target.class.object_id == klass.object_id
end

例外はもうスローされていません。

于 2012-10-18T14:15:05.933 に答える