2

Rails アプリにはディープ クローン プロセスと、ツリーのノードとその子孫、およびそれらの関連付けを削除する再帰的な削除プロセスがあります。:touch => true が関係に適用されると、これらのルーチンの両方に問題があります。1 つのレコードを更新するだけで、関連付けとツリー構造のすべての親レコードに変更が適用される場合は問題ありませんが、一括作成または削除を扱う場合は、その呼び出しの間は接触を無効にするのが理にかなっています。

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

私はグローバルを設定する必要があることを譲る直前に考えていますか?タッチが無効であることを示す変数を作成し、次に touch メソッドをオーバーライドして、super を呼び出す前にこの変数を最初にチェックします (場合によってはそうでない場合もあります)。

これを実際のコードに固める助けがあれば幸いです。:)

4

2 に答える 2

0

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

私の攻撃のポイントは、タッチされているアソシエーションを識別し、それらのメソッド定義を空のメソッドでオーバーライドし、ブロックに譲り、オーバーライドされたメソッド定義全体を元に戻すことだと思います。そのため、タッチは再び機能します。

于 2012-05-07T02:55:37.447 に答える