もくじ
やりたいこと
タイトルのまんまです。新しいテーブルのカラムに外部キーを設定します。
マイグレーションファイルの書き方
例えば、foobarsというテーブルを作成する際に、usersテーブルのid
を外部キーに設定したい場合、マイグレーションファイルは以下のような書き方になります。
(それだけだとなんか寂しいのでt.timestamps
も書いてますが今回は関係ないです。)
class CreateFoobars < ActiveRecord::Migration[6.1] def change create_table :foobars do |t| t.references :user, foreign_key: true t.timestamps end end end
これだけ!
これでuser_id
カラムにusersテーブルのid
が外部キーとして設定されます。
なぜuser
カラムではなくuser_id
カラムなのかというと、references
が_id
の部分を自動でくっつけてくれているからです。
また、references
を使うと自動でindexも張ってくれます。
indexについてはこちらの記事がシンプルでわかりやすかったです。
カラム名を別名にしたい場合
例えば中間テーブルでusersテーブルのid
を複数のカラムでそれぞれに名前を付けて外部キーに設定したい場合、以下のような書き方になります。
class CreateFoobars < ActiveRecord::Migration[6.1] def change create_table :foobars do |t| t.references :foo, foreign_key: { to_table: :users } t.references :bar, foreign_key: { to_table: :users } t.timestamps end end end
上記の書き方だと、foo_id
とbar_id
の2つのカラムが同じusersテーブルのid
を参照していることになります。
まとめ
以上がreferences
を使った外部キーの設定方法です。
他にも方法はあるようですが、それはまた別の機会に。
_id
の部分を補完してくれたり、indexを自動で張ってくれたりするのでマイグレーションファイルの記述も簡潔になるのがreferences
を使うメリットかなと思います。