21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails5】外部キーの設定メモ

Posted at

##はじめに
よく忘れてしまうのでメモとして残しときます。

##前提条件
以下のテーブルを使います。
reference.png

また「ユーザーテーブル」はすでに作成している前提で書いていきます。

##外部キーの設定

  1. フォロワーテーブルを作成。
  2. 作成したマイグレーションファイルに外部キーの設定を追加
  3. データベースを更新

###方法

# ターミナル
rails g model follower user:references follower:references

#####user:references
これでreference型のuserカラムを作成しています。

モデルを作成したら以下のマイグレーションファイルも一緒に作成されます。

db/migrate/20190727232828_create_follows.rb
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が出来上がってしまう。エラー出ると思うけど。

####解決方法
マイグレーションファイルに参照先のテーブルを指定しましょう。
上記で挙げたマイグレーションファイルを修正します。

db/migrate/20190727232828_create_followers.rb
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.作成したマイグレーションファイルに外部キーの設定を追加

db/migrate/20190727232828_create_followers.rb
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
21
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?