【Rails】テーブル同士に外部キー制約をつける

はじめに

二つのテーブルを関連づけるために、外部キーをテーブルに追加することがあります。

今回は、やることリストのアプリを例に取り、ユーザーテーブルとやること(mission)テーブルを関連づけたい場合を前提に説明します。

外部キー制約をつけると、missionsテーブルにuser_idというカラムが追加され、やることの親元であるユーザーのidを入れることができます。

外部キーをつけたテーブルを作成

まずはmissionテーブルを作成するため、以下のコマンドをターミナルで実行します。

rails g model Mission content:string date:date

マイグレーションファイルが作成されるので、以下のように編集します。

class CreateMissions < ActiveRecord::Migration[6.1]
  def change
    create_table :missions do |t|
      t.string :content
      t.date :date
      t.references :user, foreign_key: true  #追記

      t.timestamps
    end
  end
end

データ型はreferences型を使用して、「:user」でuser_idを追加します。

後ろにforeign_key: trueをつけることで外部キーが追加されます。

最後に以下のコマンドで、データベースに反映させます。

rails db:migrate

既存のテーブルに外部キーをつける

既存のテーブルに外部キーをつけたい場合は、まず以下のコマンドでカラム追加のマイグレーションファイルを作成します。

rails g migration AddColumnToMissions

作成したら、以下のように編集します。

class AddColumnToMissions < ActiveRecord::Migration[6.1]
  def change
    add_reference :missions, :user, foreign_key: true
  end
end

add_referenceの後に、追加したいテーブル(:missions)、入れたいidを持つテーブル(:user)、foreign_key: trueというように記述します。

最後にマイグレートして完了です。

rails db:migrate
タイトルとURLをコピーしました