web-dev-qa-db-ja.com

Rails:dependent =>:destroy VS:dependent =>:delete_all

Railsガイドでは、次のように記述されています。

オブジェクトは、:dependent => :destroyに関連付けられている場合はさらに破棄され、:dependent => :delete_allに関連付けられている場合は削除されます

いいねしかし、破壊されることと削除されることの違いは何ですか?私は両方を試しましたが、同じことをしているようです。

185
Sergey

違いはコールバックにあります。

:delete_allはアプリケーションで直接作成され、SQLによって削除されます。

DELETE * FROM users where compagny_id = XXXX

:destroyを使用すると、すべての子供のインスタンスが作成されます。したがって、それを破棄できない場合、またはそれぞれに独自の:dependentがある場合、そのコールバックを呼び出すことができます。

194
shingara

Railsのモデルの関連付けでは、:dependentオプションを指定できます。これは、次の3つの形式のいずれかを取ることができます。

  • :destroy/:destroy_all関連オブジェクトは、destroyメソッドを呼び出すことにより、このオブジェクトと一緒に破棄されます
  • :delete/:delete_allすべての関連オブジェクトは、:destroyメソッドを呼び出さずにすぐに破棄されます
  • :nullifyすべての関連オブジェクトの外部キーは、NULLコールバックを呼び出さずにsaveに設定されます
131
John Topley

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である必要があり、削除されるレコードは、関連付けられたレコードではなく、結合レコードです。

30

実際の主な違いは、:delete_allが使用されたときにコールバックが呼び出されないことです。ただし、:destroyを使用すると、コールバックスタック(:after_destroy:after_commit ...)が起動されます。

したがって、削除されるモデルにtouch:ing宣言がある場合は、 'dependent::destroy'ではなくdependent: :delete_allを使用することをお勧めします。

2
atlascoder