Open Fumiya-Matsumoto opened 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オブジェクトを返す |
フォロー、フォロワー関係を表す際に例えば、あるユーザーをフォローしている全てのユーザーの集合はfollowers
となり、user.followers
。また、あるユーザーがフォローしているユーザーの集合をuser.following
と表せる。
しかし、下記のようにfollowing
テーブルを作ると非常に無駄が多くなり、また別途followers
テーブルも必要となるため、メンテナンスの観点からしても非常に効率が悪くなる。
follower_id | followed_id | name | |
---|---|---|---|
1 | 2 | ... | ... |
1 | 7 | ... | ... |
1 | 10 | ... | ... |
1 | 8 | ... | ... |
ところで、あるユーザーが別のユーザーをフォローするとき、何が作成されるか。また、解除するとき、何が削除されるか。この場合、作成・削除されるのは、2人のユーザーの「関係(リレーションシップ)」である。
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を見つけ、さらにこれをキーとしてフォローしているユーザーを特定できる。
user
にfollowing
というhas_manyの関係のプロパティを持たせる
relationships
テーブルのfollowed_id
を使って対象のユーザーを取得するhas_many :following, through: :active_relationships, source: :followed
メソッド名 | 説明 |
---|---|
follow(other_user) | ユーザーをフォローする |
unfollow(other_user) | ユーザーをフォロー解除する |
following?(other_user) | ユーザーがフォローしてたらtrueを返す |
同様に、followers
というプロパティも追加した。
概要
フォロー・フォロワー機能を実装する。
目的
目的達成のために
参考