1

メソッドを持つクラスと、saveエイリアシングを使用してそれを変更する3つのミックスインがあるとします。

module Callbacks
  def save_with_callbacks
    callback :before_save
    save_without_callbacks
    end
  end

  alias_method_chain :save, :callbacks
end

同様に、save_with_transactionsave_with_timestampsがこの順序で混在しているため、 がMyModel#save呼び出さsave_with_timestampsれ、 が呼び出されsave_with_transaction、 が呼び出さsave_with_callbacksれ、 最終的に元の が呼び出されますsave

ここで、トランザクションなしで保存したいとします。を呼び出すことはできますsave_without_transactionが、タイムスタンプを設定するコードは呼び出されません。

タイムスタンプとコールバックを使用してモデルを保存し、トランザクションを保存するにはどうすればよいですか?

ミックスインを並べ替えることができますが、私の質問は、特にトランザクションではなく、真ん中を省略することです。メソッドのチェーンの途中を省略するにはどうすればよいですか?

注 - 簡潔にするために RoR の alias_method_chain を使用しましたが、私の質問はルビー全般に適用されます

4

1 に答える 1

2

とにかく、あなたの唯一の選択肢は、この機能をさらに上に処理する2番目の呼び出しチェーンを提供することだと思われます。エイリアシングでこれを行うことはできないと思います。代わりに、古いメソッドを呼び出す新しいメソッドを定義する必要があります。たとえば、次のようになります。

  1. MyModel#save <-save_with_timestamps <-save_with_transaction<-save_with_callbacks<-save。
  2. MyModel#save_other <-save_with_timestamps_other<-save_with_callbacks_other<-save_other。

(余談ですが、エイリアスの長いチェーンによってコードが非常に読みにくくなることはありませんか?個人的には、エイリアスを回避するために一生懸命努力すると思います。)

于 2011-06-30T10:44:39.593 に答える