はじめに
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テーブルとの関連性で問題が生じる。
解決策
- カスケード削除
eventsテーブルのレコードを削除する際に関連するnotificationsテーブルのレコードも自動的に削除します。
class Event < ApplicationRecord
has_many :notifications, dependent: :destroy
end
- 関連するレコードを先に削除
イベントを削除する前に、そのイベントに関連するnotificationsのレコードを手動で削除します。これは、コントローラのdestroyアクション内で実装できます。
def destroy
@event = Event.find(params[:id])
@event.notifications.destroy_all
@event.destroy
end
注意点
データの不整合や意図しないデータの削除を防ぐため、実際にコードを変更する前にバックアップを取るなどの対策を行ってください。
テスト環境で動作確認をしっかりと行うことが重要です。
まとめ
外部キー制約に関するエラーは、Rails開発中によく遭遇するエラーの一つです。エラーメッセージをしっかりと読読み解き、適切な対応を行うことで解決の糸口となります。