既に存在するテーブルに後から外部キーを追加する方法
前提として、以下のstudentsテーブルとhigh_schoolsテーブルがあり、「どの生徒がどの高校に所属しているか」を明確にするために、studentsテーブルにhigh_school_idという外部キー制約が付与されたカラムを追加していきます。
id | name | age | gender | address | created_at | updated_at |
1 | 田中圭 | 17 | male | 東京都 | 2022-02-06 | 2022-02-06 |
2 | 加藤麻衣子 | 16 | female | 埼玉県 | 2022-02-06 | 2022-02-06 |
id | name | location | year_of_establishment | is_public_school | created_at | updated_at |
1 | 新宿総合高校 | 東京都 | 1987 | true | 2022-02-06 | 2022-02-06 |
2 | 大宮学園高校 | 埼玉県 | 1959 | false | 2022-02-06 | 2022-02-06 |
まずは、外部キーカラムを追加するためのマイグレーションファイルを作成します。
$ rails g migration AddHighSchoolId
すると、新しくマイグレーションファイルが作られるので、以下の形式で記述します。
def change
add_reference :外部キーを追加するテーブル名(複数形), :外部キー参照先テーブル名(単数型), foreign_key: true
end
単にカラムを追加したい場合は、add_columnを使用しますが、
外部キーカラムを追加する場合は、add_referenceを使用します。
今回の例だと、studentsテーブルにhigh_schoolsの外部キーを持たせたいので、このように書きます。
class AddHighSchoolId < ActiveRecord::Migration[6.1]
def change
add_reference :students, :high_school, foreign_key: true
end
end
あとは、以下のコマンドを実行してマイグレーションファイルの内容をDBに反映させればOKです。
$ rails db:migrate
結果は、studentsテーブルにhigh_school_idというカラムが追加され、high_schoolsテーブルのレコードのidを格納することができるようになりました。
id | name | age | gender | address | created_at | updated_at | high_school_id |
1 | 田中圭 | 17 | male | 東京都 | 2022-02-06 | 2022-02-06 | |
2 | 加藤麻衣子 | 16 | female | 埼玉県 | 2022-02-06 | 2022-02-06 |