2012-05-04 8 views
2

私は自分のレールアプリケーションで深いクローン処理を行い、ツリーの子ノードとその子孫とその関連付けを削除する再帰的削除プロセスを持っています。これらのルーチンはどちらも問題があります。touch => trueが関係に適用されます。 1つのレコードを更新してすべての親レコードにアソシエーションとツリー構造を反映させるだけの場合は大丈夫ですが、一括作成や削除を処理するときは、その呼び出しの間タッチを無効にするのが理にかなっています。ActiveRecordのブロック期間中はタッチを無効にする

オブジェクトのタッチメソッドをアクティブにしないコードを実行するブロックを受け入れるメソッドを定義する方法について、私は方向性を探しています。

私はおそらく収穫の前に世界全体を設定するべきだと思っていますか? touchメソッドが無効になっていることを示す変数。次に、touchメソッドをオーバーライドして、superを呼び出す前にこの変数をチェックします(場合によってはそうでない場合もあります)。

これを実際のコードに固めてください。 :)

+0

こんにちは!どのようにして最終的にこれにアプローチしましたか?私はテストのための同様のケースを検討している:http://stackoverflow.com/questions/18922864/how-to-disable-belongs-to-touch-option-in-rspec-tests-for-rails-models – dgilperez

+0

私は決してこれを回避した。私はちょうど正しい順序で物事が行われていない限り、更新は非常に遅く、削除するときにエラーを起こしやすいということを受け入れなければなりませんでした。 Rails 3はモデル全体を保存しようとせず、タイムスタンプを孤立して更新するほうがはるかに優れている点で優れています。このプロジェクトが依然として詰まっているRails 2には、このような運がありません! :D –

答えて

0

これは一般的にこれを行う方法を考え出すためにかなり毛深くなるように見えます。 belongs_to:touchオプションと関連付けると宣言すると、保存/更新/破棄が成功した場合にタッチする処理を行う、関連付ける新しいメソッドを作成します。それでも頭を下げたい場合は、add_touch_callbacksを見てください。これはこのメソッドの定義とフッキングを行います。

私の攻撃のポイントは、タッチされている関連付けを特定し、そのメソッド定義を空のメソッドでオーバーライドしてブロックに降ろし、次にオーバーライドされたメソッド定義全体を元に戻したからです再び働く。

+0

これを受け入れるつもりはありませんが、これを受け入れます。これは、タイムスタンプを更新し、オブジェクト全体を保存する代わりに、関連するタッチコールバックだけを実行することによって、タッチをより効率的にすることに関するレールgithubの問題点についての質問を提起する予定です。 –

関連する問題