##はじめに
よく忘れてしまうのでメモとして残しときます。
また「ユーザーテーブル」はすでに作成している前提で書いていきます。
##外部キーの設定
- フォロワーテーブルを作成。
- 作成したマイグレーションファイルに外部キーの設定を追加
- データベースを更新
###方法
# ターミナル
rails g model follower user:references follower:references
#####user:references
これでreference型のuserカラムを作成しています。
モデルを作成したら以下のマイグレーションファイルも一緒に作成されます。
class CreateFollowers < ActiveRecord::Migration[5.2]
def change
create_table :followers do |t|
t.references :user, foreign_key: true
t.references :follower, foreign_key: true
t.timestamps
end
end
end
#####reference型について
reference型にすると下記の設定が自動でされます。
①カラム名がuserではなくuser_idとして追加される
②自動でindexが追加される
※reference型を指定しても外部キー制約は設定されていないので注意してください。
#####foreign_key: true
外部キー制約が設定されます。
参照するテーブルは指定したモデルのテーブルです。
例えば「t.references :user, foreign_key: true」では
カラム名を指定する箇所で「:user」というモデルが指定されているので、usersテーブルが参照先として設定されます。
####疑問点
上記の話だと、followerにもuserテーブルを参照先として設定したい時、:userを指定しないといけなくなる。
そうすると2個目のuser_idが出来上がってしまう。エラー出ると思うけど。
####解決方法
マイグレーションファイルに参照先のテーブルを指定しましょう。
上記で挙げたマイグレーションファイルを修正します。
class CreateFollowers < ActiveRecord::Migration[5.2]
def change
create_table :followers do |t|
t.references :user, foreign_key: true
# { to_table: :users }を追加
t.references :follower, foreign_key: { to_table: :users }
t.timestamps
end
end
end
{ to_table: :users }で参照するテーブルの指定ができます。
これでデータベースを更新してみましょう。
# ターミナル
rails db:migrate
これで外部キー制約の設定が完了です。
##まとめ
1.フォロワーテーブルを作成。
# ターミナル
rails g model follower user:references follow:references
2.作成したマイグレーションファイルに外部キーの設定を追加
class CreateFollowers < ActiveRecord::Migration[5.2]
def change
create_table :followers do |t|
t.references :user, foreign_key: true
# { to_table: :users }を追加
t.references :follower, foreign_key: { to_table: :users }
t.timestamps
end
end
end
3.データベースを更新
# ターミナル
rails db:migrate