#はじめに
今回はrailsでのマイグレーション時にreference型を扱うことがことがあったのでまとめる。
#外部キーとは
reference型を扱うにあたって外部キーについて知っておかなくてはならない。
外部キーとは、リレーショナルデータベース(RDB)で、テーブルのある列に、別のテーブルの特定の列に含まれる項目しか入力できないようにする制約。また、その際に指定する列
http://e-words.jp/w/%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC.html#:~:text=%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E3%81%A8%E3%81%AF%E3%80%81%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB,%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82
今回はarticlesテーブルにreference型のuser_idという外部キーを設定する。
#前提
sampleとしてuserテーブルとariticleテーブルを準備する。
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name
t.string :email
end
end
end
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles do |t|
t.string :title
t.string :content
end
end
end
$ rake db:migrate
#reference型のカラムの作成
reference型で作成するとuser
そのまま追加されるわけではなくuser_id
というカラム名で追加される。また、index:true
を追記することなく自動でインデックスをはってくれるというメリットもある。
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles do |t|
t.string :title
t.string :content
t.references :user, foreign_key: true
end
end
end
*foreign_key: true
をつけないと外部キー制約はつけることができない。
foreign_key: true
を書き忘れたことで設定できないこtがあった。
add_foreign_key
を使っての追加も可能。
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles do |t|
t.string :title
t.string :content
end
add_foreign_key :articles, :users
end
end
#reference型のカラムの追加
class AddReferenceColumn < ActiveRecord::Migration[6.0]
def change
add_reference :articles, :user, foreign_key: true
end
end
この際にもforeign_key: true
を忘れずに。