Rails でデータベースに外部キー制約を設定する

スポンサーリンク

Rails では、ActiveRecord デフォルトのマイグレーション機能では、外部キー制約を設定できません。公式のガイド(エントリー末尾参照)でも、execute で alter table の SQL を直接書いてあります。users テーブルの id カラムの外部キーとして user_id を使うと、自動で association の関係を作成はできますけど、外部キー制約(foreign key constraint)がデータベースに設定されることはない。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
rails 4.0.1
mysql 5.5.28

foreign key constraint(外部キー制約)を設定するには、自力で生の SQL を利用するか、あるいは foreigner という gem を利用するかの二通りの方法があるようです。今回は、自力で SQL を使って外部キー制約を設定する方法を用いました。

外部キー制約のためのヘルパー作成

毎回生SQLを書くのは辛いので、以下のようなヘルパーを作成しました。

lib/migration_helper.rb

一応、外部キー制約を削除する remove_foreign_key も作成しましたけど、試したところ、マイグレーションの self.down でこれを単独で利用すると、rollback が上手く働かないことがありました。

以下のようなマイグレーションは、rollback で self.down が動かないケースが発生したので、このような使い方はしないようにする。

create_table と同時に set_foreign_key

なので、remove_foreign_key のほうは使わずに、create_table のマイグレーションで同時に set_foreign_key を呼び出し、その self.down で drop_table する方法を採用しました。

以下のように create_table 時に同時に foreign key をセットし、rollback(self.down)では drop_table。

MySQL で外部キー制約を確認

マイグレーションを実行後、データベース(MySQL)を確認してみます。

の行で、fk_posts_users という名前で、users テーブルの id カラムを参照する posts テーブルの user_id に対して、外部キー制約が設定されているのを確認できます。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!