2011-06-30 10 views
1

saveメソッドを持つクラスと、エイリアシングを使用して修正する3つのミックスインがあるとします。そのために混入メソッド連鎖の途中をどうやって省略できますか?

save_with_transactionsave_with_timestampsため
module Callbacks 
    def save_with_callbacks 
    callback :before_save 
    save_without_callbacks 
    end 
    end 

    alias_method_chain :save, :callbacks 
end 

と同様に、最終的に元のsaveを呼び出す、save_with_callbacksを呼び出す、save_with_transactionを呼び出すようMyModel#saveコールsave_with_timestamps、。

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

タイムスタンプとコールバックを使用してモデルを保存することはできますが、トランザクションは保存しないでください。

私はミックスインを並べ替えることができますが、私の質問は特にトランザクションではなく中間を省略することです。メソッド連鎖の途中をどうやって省略することができますか?

NOTE - 私は簡潔にするためのRoRのalias_method_chainを使用しましたが、私の質問は、あなたの唯一のオプションがあると思われる一般的な

答えて

2

にルビーに適用される - 私には、とにかく - これを扱う第二の呼び出しチェーンを提供するために、機能性がさらに向上します。私はエイリアシングでこれを行うことはできないと思います。 - save_with_transaction < - save_with_callbacks < -save <保存

  1. mymodelというの#<を-save_with_timestamps:ので、何かのように - あなたの代わりに、古いメソッドを呼び出して新しいメソッドを定義する必要があるとしています。
  2. MyModel#save_other < -save_with_timestamps_other < - save_with_callbacks_other < -save_other。

(余談として、読み、あなたのコードは非常に困難にするつもりは別名の長い鎖は、個人的に私は、私はそれらを避けるために懸命に働くだろうと思いますか?ありません。)

+0

はい、彼らは時々それを作るのですか読むのは難しいですが、Railsのコードベースはそれらを大量に使います。 – Simon

+1

私の母親が言っているように、「レールのコードベースが崖から飛び降りたら、あなたもそれをやるでしょうか?」 ...大丈夫、彼女は実際に言っていないだろう... :) – Andy

関連する問題