親子関係のモデルを作成し、親のレコードを削除したときに
子も一緒に削除したいってのはよくあると思う。
何も意識せずに、
: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 の方が効率的。