delete_all と destroy_all について

諸事情で Rails 1.1.6 を使っているため、最近の事情には合致しないかもしれませんが、以下のような違いがありました。データベースには MySQL を使っています。

items と users が多対多の関係で、中間テーブルに item_users を用いているとします。高速化のため item_users テーブルの item_id 及び user_id は null 値を認めず、デフォルト値として0を指定しています。

@items = Item.find(:first) # 適当にアイテムを取得
@items.item_users.delete_all # 関連を削除

このように delete_all を使うと、削除された関連はレコードとしては削除されず item_id = 0 になって残りました。

一方、以下のコードを確認してください。

@items = Item.find(:first) # 適当にアイテムを取得
@items.item_users.destroy_all # 関連を削除

こちらでは、レコードからも値が削除されました。本来行いたい動作はこちらだと思うので、なるべく destroy_all を用いた方がいいのかもしれません。