ume

rails7 本番環境ActiveRecord::InvalidForeignKey エラー 

前書き

  • 開発環境では動くけど本番環境では動かなくエラーにハマったので記事に残します
    環境
  • Rails 7.0.8.1
  • Ruby 3.2.1
  • Docker version 24.0.7

結論

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は親テーブルに関連する子テーブルを同時に削除するオプション

  • このオプションをつける基準は「親テーブルを削除したした時に子テーブルのデータは意味がなくなるかどうか」