【rails】フォローする(フォローしているuserの取得)

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

フォロー機能(n対nの関係)

フォローする人(follower) ✕ フォローされる人(following)

どちらもuserなので、usersテーブルから2つのuser_idを引っ張ってこないといけない

【今回】自分がフォローしている人との関係性を作っていく

テーブル

フォローの関係は以下のテーブルのようになる

idfollowing_idfollower_id
112
213
321

※次回は、フォロワーとの関係性作りと、フォローを外す機能を実装


Relationshipテーブル

関係を表すRelationshipテーブルを作成する

rails g model Relationship


followingとfollowerの関係性を作る

作成されたマイグレーションファイルを編集する

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

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」が外部キーになる

フォローしているuserを探すには?

例)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に紐づいている(従属している)

followerfollowingともにクラス名ではないので、class_name: 'User'と明記する