1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RailsでActiveRecord::InvalidForeignKeyエラーが発生したときの解決策

Posted at

はじめに

Railsを学ぶ中で、データベースの外部キー制約に関連するエラーに出会うことは珍しくありません。この記事では、私が遭遇したActiveRecord::InvalidForeignKeyエラーとその解決方法を共有します。

背景

フロントをVue.js/Vuetifyで、サーバーサイドをRailsで、SPAの予定管理アプリを作っていて、その中の通知機能を作成中に生じたエラーです。

エラーの内容

以下のようなエラーメッセージがターミナルログで出力されました。

ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  update or delete on table "events" violates foreign key constraint "fk_rails_78f4b5a537" on table "notifications" DETAIL:  Key (id)=(334) is still referenced from table "notifications".)

このエラーメッセージから以下の点が読み取れます。

・eventsテーブルのレコードを削除しようとした際にエラーが発生。
・notificationsテーブルがeventsテーブルに対する外部キー制約を持っている。
・該当のeventsテーブルのレコードを削除しようとすると、notificationsテーブルとの関連性で問題が生じる。

解決策

  1. カスケード削除
    eventsテーブルのレコードを削除する際に関連するnotificationsテーブルのレコードも自動的に削除します。
class Event < ApplicationRecord
  has_many :notifications, dependent: :destroy
end
  1. 関連するレコードを先に削除
    イベントを削除する前に、そのイベントに関連するnotificationsのレコードを手動で削除します。これは、コントローラのdestroyアクション内で実装できます。
def destroy
  @event = Event.find(params[:id])
  @event.notifications.destroy_all
  @event.destroy
end

注意点

データの不整合や意図しないデータの削除を防ぐため、実際にコードを変更する前にバックアップを取るなどの対策を行ってください。
テスト環境で動作確認をしっかりと行うことが重要です。

まとめ

外部キー制約に関するエラーは、Rails開発中によく遭遇するエラーの一つです。エラーメッセージをしっかりと読読み解き、適切な対応を行うことで解決の糸口となります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?