Rails で外部キー制約を使う方法

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 では外部キー制約が設定されないので、動作確認は MySQLPostgreSQL でやる必要あり。

MySQL で試してみたところ、Comment に存在しない entry_id をセットして保存しようとしたら

ActiveRecord::InvalidForeignKey: Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails 

というエラーが発生した。外部キーで紐づいている Entry を削除したら、Comment もちゃんと削除された。

データの整合性を保つのはデータベースの得意分野なのだから、Rails でゴリゴリやらずにデータベースに任せてしまえ、って思うようになった今日この頃。