【Rails】別名外部キー
フォローフォロワー機能の復習。
別名外部キーとは
外部キー(FK)として参照されるカラムに別の名前をつけること。外部キーのエイリアスとも言う。
別名外部キーを使う場面
- 複数の外部キーが同じテーブルを参照する場合
テーブル間に複数の関連性があり、それぞれの外部キーが同じテーブルを参照する場合に、別名外部キーを使って外部キーの役割を区別する。
具体例
フォロー機能を例にする。
users テーブル:
id (主キー) | username |
---|---|
1 | a |
2 | b |
3 | c |
relationships テーブル:
id (主キー) | follower_id(外部キー、usersテーブルのidを参照) | followed_id (外部キー、usersテーブルのidを参照) |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
3 | 2 | 1 |
上記の users
テーブルはユーザー情報を格納するテーブルで、id
が主キー。relationships
テーブルはユーザー間のフォロー/フォロワーの関係を表すテーブルで、follower_id
と followed_id
がそれぞれ他のユーザーを参照する外部キーになる。
別名外部キーを使うことでfollower_id
が「フォローするユーザーのID」を参照し、followed_id
が「フォローされるユーザーのID」を参照させることができる。どちらもusers
テーブルの id
カラムと関連している。
定義方法
belongs_to
メソッドと class_name
オプションを使用して別名外部キーを定義する。
class Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User', foreign_key: 'follower_id'
belongs_to :followed, class_name: 'User', foreign_key: 'followed_id'
end
class User < ApplicationRecord
has_many :follower_relationships, class_name: 'Relationship', foreign_key: 'follower_id'
has_many :followed_relationships, class_name: 'Relationship', foreign_key: 'followed_id'
end
上記のコードでは、Relationship
モデルに対して belongs_to
メソッドを使用して2つの別名外部キーを定義している。class_name
オプションで関連付けるモデルのクラス名を指定し、foreign_key
オプションで外部キーとして使用するカラム名を指定する。こうすることで、follower
と followed
メソッドがそれぞれ User
モデルを参照する外部キーとして機能する。
また、User
モデル側にも has_many
メソッドを使用して逆の関連付けを定義している。これにより、User
モデルからも follower_relationships
と followed_relationships
メソッドを使って Relationship
モデルを参照できるようになる。
内容を忘れていたので復習でした。
Discussion