Fumiya-Matsumoto / run_manage_spa

0 stars 0 forks source link

フォロー・フォロワー機能 #10

Open Fumiya-Matsumoto opened 2 years ago

Fumiya-Matsumoto commented 2 years ago

概要

フォロー・フォロワー機能を実装する。

目的

目的達成のために

参考

Fumiya-Matsumoto commented 2 years ago

使えるようになったメソッド

メソッド 用途
active_relationship.follower フォロワーを返す
active_relationship.followed フォローしているユーザーを返す
user.active_relationships.create(followed_id: other_user.id) userと紐付けて能動的関係を作成/登録する
user.active_relationships.create!(followed_id: other_user.id) userを紐付けて能動的関係を作成/登録する(失敗時にエラーを出力)
user.active_relationships.build(followed_id: other_user.id) userと紐付けた新しいRelationshipオブジェクトを返す
Fumiya-Matsumoto commented 2 years ago

Relationshipモデルについて

フォロー、フォロワー関係を表す際に例えば、あるユーザーをフォローしている全てのユーザーの集合はfollowersとなり、user.followers。また、あるユーザーがフォローしているユーザーの集合をuser.followingと表せる。

しかし、下記のようにfollowingテーブルを作ると非常に無駄が多くなり、また別途followersテーブルも必要となるため、メンテナンスの観点からしても非常に効率が悪くなる。

followingテーブル

follower_id followed_id name email
1 2 ... ...
1 7 ... ...
1 10 ... ...
1 8 ... ...

ところで、あるユーザーが別のユーザーをフォローするとき、何が作成されるか。また、解除するとき、何が削除されるか。この場合、作成・削除されるのは、2人のユーザーの「関係(リレーションシップ)」である。

active_relationshipsテーブル

follower_id followed_id
1 2
1 7
3 1
7 2
1 10
2 1
1 8
9 1

relationshipsテーブルがあれば、follower_idをキーとして、followed_idを見つけ、さらにこれをキーとしてフォローしているユーザーを特定できる。

Fumiya-Matsumoto commented 2 years ago

進捗

メソッド名 説明
follow(other_user) ユーザーをフォローする
unfollow(other_user) ユーザーをフォロー解除する
following?(other_user) ユーザーがフォローしてたらtrueを返す
Fumiya-Matsumoto commented 2 years ago

同様に、followersというプロパティも追加した。