LoginSignup
7
14

More than 3 years have passed since last update.

【Rails】Twitterのようなサービスで相互フォローを取得する方法

Posted at

はじめに

Twitterのようなサービスで、「相互フォロー関係のみDM機能を解放する」などの機能をつける際に必要となる実装を紹介します。

自分はマッチングアプリ政策の際に実装しました。

User.rb

user.rb

has_many :relationships
has_many :followings, through: :relationships, source: :follow
has_many :reverses_of_relationship, class_name: 'Relationship', foreign_key: 'follow_id'
has_many :followers, through: :reverses_of_relationship, source: :user

Relationモデルでは、user_idとfollower_idを使用してフォローフォロワー関係を作っています。(Railsチュートリアルと実装方法は同じ)
上記のように書くことで、User Classのオブジェクトでfollowingsメソッドとfollowersメソッドを使用できるようになります。
これらを利用して、相互フォローかどうか検証します。

Controller

自分の場合、トップページに相互関係にあるフォロワーを表示するため、toppages#indexに実装をします。

toppages_controller.rb
class ToppagesController < ApplicationController
  def index 
    @users = current_user.followings & current_user.followers if logged_in?
  end
end

単純に自分がフォローしているユーザーと、フォローされているユーザーの積集合をとれば取得できます。

また、user.rbにメソッドとして用意しても良さそうです。

user.rb
def matchers
  followings & followers
end

おまけ

自分がフォローしていないかつ、フォローしてもらっているユーザーの表示方法です。

def followers
  @user = User.find(params[:id])
  @followers = @user.followers.where.not(id:@user.followings.ids).page(params[:page])
end

何か他に良い実装方法がありましたら教えていただきたいです!
以上です!

7
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
14