has_manyの:dependentパラメータ

親子関係のモデルを作成し、親のレコードを削除したときに
子も一緒に削除したいってのはよくあると思う。


何も意識せずに、
:dependent => :destroy を指定していたのだが
これだと
1.親のidで子を検索
2.子の検索結果を元に1レコードずつ削除
3.親レコードを削除


となる。
ログはこんな感じ。

Child Load (0.3ms)   SELECT * FROM `children` WHERE (`children`.parent_id = 6) 
Child Columns (1.5ms)   SHOW FIELDS FROM `children`
Child Destroy (0.3ms)   DELETE FROM `children` WHERE `id` = 36
Child Destroy (0.1ms)   DELETE FROM `children` WHERE `id` = 37
Child Destroy (0.1ms)   DELETE FROM `children` WHERE `id` = 38
Parent Destroy (0.1ms)   DELETE FROM `parents` WHERE `id` = 6


:dependent => :delete_all に変更してみると
1.子レコードを親のIDを元に削除
2.親レコードを削除
となった。こっちの方がいいよね。

Child Delete all (0.2ms)   DELETE FROM `children` WHERE ((parent_id = 7)) 
Parent Destroy (0.1ms)   DELETE FROM `parents` WHERE `id` = 7

要は

制約がなければ、:dependent => :delete_all の方が効率的。