外部キーをもつデータのdestroy機能の搭載について
Railsのアプリケーションの作成時に、外部キーを用いている場合の削除昨日の搭載について記載します。
今回作成したモデル
・item.rb
・item_image.rb
各々のモデルの関連づけは以下コードの通り。
class Item < ApplicationRecord ~ has_many :item_images ~ end
class ItemImage < ApplicationRecord belongs_to :item ~ end
外部キーによってitemとitem_imageが関連づけられている状態です。
この状態でitemの削除機能を実装すると、下記内容のエラー文が表示されます。
ActiveRecord::StatementInvalid: Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails
要因:外部キーの参照整合性
外部キーは、主キーのテーブルと外部キーのテーブルを関連づけ、主キー側のテーブルデータへの変更に制限を加えることができるもの。
今回の例で言うと、itemが削除された際にitemの主キーを参照するitem_imageテーブルのデータは参照先を持たない状態になる可能性があり、外部キーの設定をすることでこれを未然に防いでいます。
対策:外部制約キーの設定
上記を解決するには、destoryで外部キーとして設定しているレコード削除させるように、dependent: :destroy
を設定すればOK。
class Item < ApplicationRecord ~ has_many :item_images, dependent: :destroy ~ end
上記コード記載により、外部キーとして関連づけられているものもまとめて削除することが可能になる。