2012-03-31 11 views

答えて

23

はMongoidでは(ともActiveRecordの私は信じている)、deleteだけオブジェクトをデータベースから削除します。 destroyはオブジェクトを削除し、モデルが定義した適切なコールバックをすべて実行します。したがって、モデルにbefore_destroyコールバックがあり、そのモデルのインスタンスがdeleteの場合、before_destroyコールバックは呼び出されません。

したがってdependent: :destroyは、削除時にモデルのコールバックを実行し、dependent: :deleteは実行しません。

+0

コールバックがない場合は同じですか? –

+2

ええ、おそらく 'destroy'の使用を検討します。コールバックを追加する場合は、コールバックを実際に実行させたくない場合を除いて、 'delete'から' destroy'に変更することを忘れないでください。 –

+3

コールバックを持っていなくても同じものではありません。 'destroy'はコールバックに依存するため、コールバックを実行するために関連するドキュメントをロードし、DELETEクエリを実行する必要があります。 'delete'は単にDELETEクエリを作成します。 その後、destroyは "より安全"ですが、deleteは "より速く" – tothemario

2
  • destroyモデルコールバックを実行し、DBにREMOVEクエリを実行します。
  • deleteは、DBに対してREMOVEクエリを作成するだけです。

名前はActiveRecordから取られています。そのため、それらはmongoとよく一致しません。

deletedestroy以上の最適化として表示されます。 destroyを使用するときは、before_destroyのコールバックが実行されていることを確認して、適切なクリーンアップを実行します。一方、Model.destroy_allのような操作を行う場合は、Model.delete_allが1つのクエリを作成するかどうかにかかわらず、すべての要素をロードして、それぞれのREMOVEクエリを実行する必要があります。

関連する問題