前書き
結論
dependent: :destoroyオプションをつける
dependent: :destoroyオプションとは?
⇨親テーブルのレコードを削除する時関連するレコード(子テーブルのレコード)も削除される。 詳しくは↓ www.y-hakopro.com
経緯
今ECサイトを作成しており、3つのテーブル(Cart,CartProduct,Product)があります. 関係性は
1対多(Cart対CartProduct). 中間テーブル(CartProduct). 1対多(Product対CartProduct).
になっています.
本番環境で親テーブル(Cart)のレコードを削除しようとすると次のエラーが出力されました。
エラー内容
ActiveRecord::InvalidForeignKey in CustomersController#create PG::ForeignKeyViolation: ERROR: update or delete on table "carts" violates foreign key constraint "fk_rails_a4f3e327f3" on table "cart_products" DETAIL: Key (id)=(1) is still referenced from table "cart_products".
これは一言で言うと「子テーブル(CartProduct)のレコードには外部キー(親テーブルCart)があるので親テーブル(Cart)のレコードは削除できないよ」
まとめ
dependent: :destoroyは親テーブルに関連する子テーブルを同時に削除するオプション
このオプションをつける基準は「親テーブルを削除したした時に子テーブルのデータは意味がなくなるかどうか」