※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
フォロー機能(n対nの関係)
フォローする人(follower) ✕ フォローされる人(following)
どちらもuserなので、usersテーブルから2つのuser_idを引っ張ってこないといけない
【今回】自分がフォローしている人との関係性を作っていく
フォローの関係は以下のテーブルのようになる
id | following_id | follower_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
3 | 2 | 1 |
※次回は、フォロワーとの関係性作りと、フォローを外す機能を実装
Relationshipテーブル
関係を表すRelationshipテーブルを作成する
rails g model Relationship
作成されたマイグレーションファイルを編集する
class CreateRelationships < ActiveRecord::Migration[6.0]
def change
create_table :relationships do |t|
t.references :following, null: false, foreign_key: { to_table: :users }
t.references :follower, null: false, foreign_key: { to_table: :users }
t.timestamps
end
end
end
foreign_keyは外部キーのこと
following、followerは「usersテーブル」と紐づいていることを明記する
編集したファイルを実行する
rails db:migrate
テーブルの関連性を作るために外部キーを使う
外部キーとは
例)articlesとusersを紐づけたので、Articlesテーブルにuser_idがある
→ user_idは外部キーになる
userの投稿したarticlesを取得することができる
例)記事に「いいね」したuserを探したい
likesテーブルには「article_id」と「user_id」が存在している
- usersテーブルからlikesテーブルを見る→「user_id」が外部キーになる
- articlesテーブルからlikesテーブルを見る→「article_id」が外部キーになる
例)user1はuser2をフォローしている
- フォローしているuser1から見ると、relationshipテーブルの「follower_id」が外部キーになる
→「follower_id」が「1」
→ user1がフォローしているuserを取得できる - フォローされているuser2から見ると、relationshipテーブルの「following_id」が外部キーになる
→「following_id」が「2」
→ user2をフォローしているuserを取得できる
user.rbを開く
has_many :following_relationships, foreign_key: 'follower_id', class_name: 'Relationship', dependent: :destroy
自分がフォローしているusersのことを「followings」と名付ける
誰かをフォローするとき、外部キー「follower_id」は自身のuser_idで自動で作成される
誰をフォローするのか、「following_relationships」を作らないといけない
user.rbでhas_many
と書くと、railsはuser_id
を外部キーだと認識する
→ 今回、外部キーはuser_id
ではないので、foreign_key: 'follower_id'
と指定する
following_relationships
はモデル名でもクラス名でもないので指定する
→ class_name: 'Relationship'
上記に続けて、user.rbに以下を書く
has_many :followings, through: :following_relationships, source: :following
自分がフォローしているuserを、relationshipを経由して取得する
→ through: :following_relationships
followings
はモデル名でもクラス名でもないので、source
を記載する
→ source: :following
Relationship.rbを開く
class Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :following, class_name: 'User'
end
Relationshipはfollower、followingに紐づいている(従属している)
follower
、following
ともにクラス名ではないので、class_name: 'User'
と明記する