5

いつ使用するか、いつ使用するかを知る必要があり:dependent => :destroy_allます:dependent => :destroy

モデルにhas_manyの子モデルがあり、使用した場合はどうなり:dependent => :destroyますか?最初の子モデルのみを破棄しますか?

このコード行は間違っていますか?

has_many books, :dependent => :destroy

このようになりますか:

has_many books, :dependent => :destroy_all

4

2 に答える 2

6

これはすべての本を破壊します。それらのすべて。

has_many books, :dependent => :destroy

覚えておくべき重要なことは、関連するすべてのブックでメソッドが:dependent => :destroy呼び出されることです。#destroy各ブックを呼び出すことにより#destroy、各ブックに対して任意のbefore_destroyまたはafter_destroyコールバックが実行されます。

当然、依存する本がたくさんある場合、このプロセスは費用がかかる可能性があります。

:destroy_all無効です、多分あなたは考えてい:delete_allました。:delete_all(だけでなく)との違い:destroyは、Railsが単一のSQLステートメントを発行して、依存するすべての本のレコードを削除することです。#destroyBookレコードではメソッドは呼び出されず、noまたはbefore_destroycallbackafter_destroyは実行されません。

利点は、単一のSQLステートメントが、各レコードを呼び出すよりも、データベースからレコードを削除する方が何倍も効率的#destroyであることです。

これを知ることは非常に重要です。Bookモデルにコールバックがある場合、定義すると、Bookモデルで定義したコールバックを無視する効果が*_destroyあることに注意してください。:dependent => :delete_all

于 2013-01-08T00:39:10.767 に答える
0

最初の行は正しく、2番目の行は正しくないと確信しています。

ドキュメントの特定のセクションへのリンクは次のとおりです。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options

私の理解では:dependent、関連付けをループして、指定された関数を呼び出します。これ:destroyは、呼び出すのが正しい関数であることを意味します。(:destroy_allコレクションにのみ有効です。)

それがお役に立てば幸いです。

于 2013-01-08T00:22:11.190 に答える