Railsガイドでは、次のように記述されています。
オブジェクトは、
:dependent => :destroy
に関連付けられている場合はさらに破棄され、:dependent => :delete_all
に関連付けられている場合は削除されます
いいねしかし、破壊されることと削除されることの違いは何ですか?私は両方を試しましたが、同じことをしているようです。
違いはコールバックにあります。
:delete_all
はアプリケーションで直接作成され、SQLによって削除されます。
DELETE * FROM users where compagny_id = XXXX
:destroy
を使用すると、すべての子供のインスタンスが作成されます。したがって、それを破棄できない場合、またはそれぞれに独自の:dependent
がある場合、そのコールバックを呼び出すことができます。
Railsのモデルの関連付けでは、:dependent
オプションを指定できます。これは、次の3つの形式のいずれかを取ることができます。
:destroy/:destroy_all
関連オブジェクトは、destroy
メソッドを呼び出すことにより、このオブジェクトと一緒に破棄されます:delete/:delete_all
すべての関連オブジェクトは、:destroy
メソッドを呼び出さずにすぐに破棄されます:nullify
すべての関連オブジェクトの外部キーは、NULL
コールバックを呼び出さずにsave
に設定されますdestroyは関連する要素を削除しますを参照してくださいdelete_allは自己テーブルから複数のデータを削除できます as DELETE * FROM table where field = 'xyz'
:依存する可能性のあるオプション:
所有者が破壊されたときに関連付けられたオブジェクトに何が起こるかを制御します。これらはコールバックとして実装され、Railsは順番にコールバックを実行することに注意してください。したがって、他の同様のコールバックは:dependent動作に影響を与える可能性があり、:dependent
動作は他のコールバックに影響を与える可能性があります。
:destroy
は、関連するすべてのオブジェクトも破棄します。
:delete_all
は、関連するすべてのオブジェクトをデータベースから直接削除します(したがって、コールバックは実行されません)。
:nullify
は、外部キーをNULLに設定します。コールバックは実行されません。
:restrict_with_exception
は、関連するレコードがある場合に例外を発生させます。
:restrict_with_error
は、関連付けられたオブジェクトがある場合、エラーを所有者に追加します。
:through
オプションを使用する場合、結合モデルの関連付けは、belongs_toである必要があり、削除されるレコードは、関連付けられたレコードではなく、結合レコードです。
実際の主な違いは、:delete_all
が使用されたときにコールバックが呼び出されないことです。ただし、:destroy
を使用すると、コールバックスタック(:after_destroy
、:after_commit
...)が起動されます。
したがって、削除されるモデルにtouch:
ing宣言がある場合は、 'dependent::destroy'ではなくdependent: :delete_all
を使用することをお勧めします。