notify_observersを上書きしないでください。コアクラスにパッチを当てることは本当に悪い考えです。代わりに、何をやるべきことはこれです:
だけではなく、メソッド名に制限されているモデルのinstance methodを呼び出して、クラスのメソッドを自分で呼び出す:
# Notify list of observers of a change.
def notify_observers(*arg)
observer_instances.each { |observer| observer.update(*arg) }
end
それはあなたが与える任意の引数に沿って通過しますあなたのオブザーバーの#updateメソッドに渡します。これは、自分のオブザーバークラスの中に上書きすることができます。
デフォルトは余分な引数を受け入れないが、あまりにも複雑ではありませんん。
def update(observed_method, object, &block) #:nodoc:
return unless respond_to?(observed_method)
return if disabled_for?(object)
send(observed_method, object, &block)
end
だから、単に例えば、あなたの観察者にこれを追加します。
def update(observed_method, object, *args)
return unless respond_to?(observed_method)
return if disabled_for?(object)
send(observed_method, object, *args)
end
def after_pay(payee, amount)
...
end
とコール
Payee.notify_observers(:after_pay, payee, amount)
私が気にする最も自然なことは、監視対象のオブジェクトが関連するアカウント、受取人、金額にアクセスできるようになるため、代わりに「支払い」または「取引」モデルを使用し、過去の取引のためにペーパートレイルを持っているという追加のボーナスがあります。 –
ありがとう、ヨルダン。あなたの提案は非常に洞察力がありますが、私はプログラミングロジックに関係しない理由でこの状況でその決定を変更することはできません:) – AdamNYC