はじめに
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
何か他に良い実装方法がありましたら教えていただきたいです!
以上です!