【rails】フォロワーの取得・フォローを外す

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

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

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

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

【今回】

  • 自分をフォローしている人(フォロワー)との関係性を作っていく
  • フォローを外せるようにする

テーブル

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

idfollowing_idfollower_id
112
213
321

※前回は、自分がフォローしている人との関係作りを実装


フォロワーとの関係を作っていく

user.rbを開く

  has_many :follower_relationships, foreign_key: 'following_id', class_name: 'Relationship', dependent: :destroy

誰かをフォローするとき、外部キー「follower_id」は自身のuser_idで自動で作成される

誰をフォローするのか、「following_relationships」を作らないといけない

user.rbでhas_manyと書くと、railsはuser_idを外部キーだと認識する
→ 今回、外部キーはuser_idではないので、foreign_key: 'following_id'と指定する

follower_relationshipsはモデル名でもクラス名でもないので指定する
→ class_name: 'Relationship'


上記に続けて、user.rbに以下を書く

  has_many :followers, through: :follower_relationships, source: :follower

自分がフォローしているuserを、relationshipを経由して取得する
→ through: :follower_relationships

followingsはモデル名でもクラス名でもないので、sourceを記載する
→ source: :follower


フォローを外す

user.rbを開く

  def unfollow!(user)
    relation = following_relationships.find_by!(following_id: user_id)
    relation.destroy!
  end

following_relationships.find_by!(following_id: user_id)
→ 自分がフォローしているuserの中から、該当のuserを探す

次に、関係性をdestroyする


follow!・create!・destroy!・find_by!

すべて「」をつけている
→ 期待している挙動が行われなかったとき、エラーを起こして止めてほしいため

#DAY2