Rails:外部キー制約をマイグレーションで表現する方法Rails:外部キー制約をマイグレーションで表現する方法suin2016年8月27日Railsのマイグレーションではreferencesを使うことで外部キー制約を表現することができます。trueオプションの違い、両者を使った場合の振る舞い、referencesでは表現できない外部キー制約について触れたいと思います。次のようなCompanyとProjectの一対多の関係性を例に考えます。:companyを追加し、Companyに外部キー制約を貼ってみます。endendこのマイグレーションを実行すると、次のようにprojectsテーブルが生成されます。CREATE文を読んでみるとわかりますが、外部キー制約が貼られていません。referencesはデフォルトでは外部キー制約にならないようです。trueオプションを付けてマイグレーションを実行してみます。endend実行結果がこれです。company_idカラムにインデックスはつきましたが、やはり外部キー制約にはなっていません。trueを付けて実行してみます。endendすると、company_idカラムにインデックスと外部キー制約がつきました。trueを組み合わせた場合どうなるか見ておこうと思います。endendこれによって作られるテーブルは次のようになります。trueだけのときは、company_idカラムのインデックス名がfk_rails_44a549d7b3というfk始まりでしたが、今回はindex_projects_on_company_idになっています。それ以外の違いはありませんね。次のような関連性を考えてみます。Messageには送信者と受信者がいて、両方ともUserを参照するような関連性です。test/fixtures/messages.yml次に、referencesを使ってMessagesテーブルからUsersテーブルに外部キー制約をつけてみます。foreign_keyの引数はドキュメントではbool値でしたが、もしやカラム名を指定できるのではと思ったので、試しにカラム名にしてみます。endendマイグレーションを実行します。すると、エラーになり、マイグレーションが失敗しました。foreign_keyの引数はbool値のみで、user_idカラムが2回作られる格好となってしまい、エラーになったようです。`fk_rails_273a25a7a6`こうしたケースでは、referencesとforeign_keyで外部キー制約を作ることができないので、add_foreign_keyを使います。次のようにマイグレーションファイルを書き換えると期待した通りの振る舞いになります。endend作られるテーブルは次のようになります。:<カラム名>で対応するということになります。trueを組み合わせるとどうなるか同じモデルに複数外部キー制約をつける場合まとめ。