Rails で外部キー制約を設定したいなら、foreigner を使うのが良さそう。
foreigner をインストールすると、マイグレーションで外部キー制約を設定できる。
テーブル作成時なら
class CreateComments < ActiveRecord::Migration def change create_table do |t| t.reference :entry t.string :content t.timestamp t.foreign_key :entries, dependent: :delete end end end
テーブル変更時なら
class AddForeignKeyToComments < ActiveRecord::Migration def change change_table do |t| t.foreign_key :entries, dependent: :delete end end end
という風に書ける。
SQLite では外部キー制約が設定されないので、動作確認は MySQL や PostgreSQL でやる必要あり。
MySQL で試してみたところ、Comment に存在しない entry_id をセットして保存しようとしたら
ActiveRecord::InvalidForeignKey: Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails
というエラーが発生した。外部キーで紐づいている Entry を削除したら、Comment もちゃんと削除された。
データの整合性を保つのはデータベースの得意分野なのだから、Rails でゴリゴリやらずにデータベースに任せてしまえ、って思うようになった今日この頃。