【Rails】別名外部キー

2023/08/03に公開

フォローフォロワー機能の復習。

別名外部キーとは

外部キー(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_idfollowed_id がそれぞれ他のユーザーを参照する外部キーになる。

別名外部キーを使うことでfollower_id が「フォローするユーザーのID」を参照し、followed_id が「フォローされるユーザーのID」を参照させることができる。どちらもusers テーブルの id カラムと関連している。

定義方法

belongs_to メソッドと class_name オプションを使用して別名外部キーを定義する。

app/models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: 'User', foreign_key: 'follower_id'
  belongs_to :followed, class_name: 'User', foreign_key: 'followed_id'
end
app/models/user.rb
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 オプションで外部キーとして使用するカラム名を指定する。こうすることで、followerfollowed メソッドがそれぞれ User モデルを参照する外部キーとして機能する。

また、User モデル側にも has_many メソッドを使用して逆の関連付けを定義している。これにより、User モデルからも follower_relationshipsfollowed_relationships メソッドを使って Relationship モデルを参照できるようになる。


内容を忘れていたので復習でした。

Discussion