ham-capのブログ

プログラミング学習の記録

【Rails】referencesを使って外部キーを設定する!

もくじ

やりたいこと

タイトルのまんまです。新しいテーブルのカラムに外部キーを設定します。

マイグレーションファイルの書き方

例えば、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_idbar_idの2つのカラムが同じusersテーブルのidを参照していることになります。

まとめ

以上がreferencesを使った外部キーの設定方法です。 他にも方法はあるようですが、それはまた別の機会に。 _idの部分を補完してくれたり、indexを自動で張ってくれたりするのでマイグレーションファイルの記述も簡潔になるのがreferencesを使うメリットかなと思います。