※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
フォロー機能(n対nの関係)
フォローする人(follower) ✕ フォローされる人(following)
どちらもuserなので、usersテーブルから2つのuser_idを引っ張ってこないといけない
【今回】
- 自分をフォローしている人(フォロワー)との関係性を作っていく
- フォローを外せるようにする
フォローの関係は以下のテーブルのようになる
id | following_id | follower_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
3 | 2 | 1 |
※前回は、自分がフォローしている人との関係作りを実装
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する
すべて「!」をつけている
→ 期待している挙動が行われなかったとき、エラーを起こして止めてほしいため
#DAY2