Rails :: destroyメソッドを上書きする方法は?
-
27-10-2019 - |
質問
:destroyメソッドの動作を上書きするために多くのことを試みましたが、何も機能しません。最初にacts_as_paranoiaプラグインを使用しましたが、has_many:throughアソシエーションのモデルでは機能しません。
次のようなことをするためだけに:destroyメソッドを上書きしたい: ジェネラコディセタグプレ
つまり、レコード自体を破棄するのではなく、別のフィールド(ステータスを0)を更新したいだけです。
解決
試しましたか?: ジェネラコディセタグプレ
編集:コメントに基づいて、何か他のものが機能している可能性があり、それはアソシエーション定義の(:dependent=> '')指定である可能性があります-またはそれがHABTMの場合、まったく機能しない可能性があります。たぶん
削除または破棄しますか?
has_manyおよびhas_and_belongs_to_manyアソシエーションにはメソッドがあります destroy、delete、destroy_all、delete_all。
has_and_belongs_to_manyの場合、削除と破棄は同じです。 結合テーブルのレコードを削除します。
has_manyの場合、destroyは常にのdestroyメソッドを呼び出します コールバックが実行されるようにレコードが削除されます。ただし、削除は によって指定された戦略に従って削除を行う :dependentオプション、または:dependentオプションが指定されていない場合は、 デフォルトの戦略に従います。デフォルトの戦略は:nullifyです( デフォルトのhas_many:throughを除いて、nilへの外部キー) 戦略はdelete_allです(結合レコードを実行せずに削除します コールバック)。
他のヒント
これを行う最善の方法は、before_destroy:
フィルターを上書きして依存関係を操作することだと思います:
ジェネラコディセタグプレ
ただし、destroy
はキャンセルされません。
マイクドが言ったように、このコードは、品種を「手動で」破壊したい場合に適していました: ジェネラコディセタグプレ
これは完全に機能します。ただし、前述したように、親レコードを更新すると、子で呼び出されたdestroy / delete / delete_allメソッドが見つかりませんでした...したがって、誰かがアイデアを持っている場合は...