チワワかわいいブログ

RUNTEQでrails勉強する日々の記録

2020/12/20 railsチュートリアル14章

フォローする

モデルの作成(フォローとフォロワーのモデル設計)

contentカラム、user_idカラム、userとの関連付け

フォローする

→user.id has_many follow_idとfollowed_id
→フォロー用やフォロワー用のテーブル更新はどうするか?
follower_idがfollwed_idをフォローするというデータをモデルに貯めていくことから始める
どうにかしてそれぞれをuserモデルのidと紐付けていく

referencesは使えない

→follower_idとfollowed_idが存在するため、モデル名_idが使えない
→referencesはモデル名が存在することを想定して紐付けを行う機能
データベースへの問い合わせは頻繁に行われるためインデックスは作っておく

add_index :relationships, :follower_id #フォロワーを検索
add_index :relationships, :followed_id #フォローを検索
add_index :relationships, [:follower_id, :followed_id], unique: true #二つ揃って検索を行うこともある、フォロー・フォロワーの関係は1つ(unique)である必要がある(validationでもかけるがDBレベルで制約をかける)
UserとRelationshipの関連付け
has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy

Userから見たらUserはたくさんのactive_relationshipを持っている(has_many)
Relationshipから見たら、user(followed/follower) は一つのUserはただ一つである(belongs_to)
なぜ「active_relationships」とモデル名と異なる名前にしているか?

has_many :microposts
#default: class_name: "Micropost"
#default: foreign_key: "user_id"(Micropost上でuser.idと紐付けるキー)
=> #{Model Name}s でモデル名を探して紐付ける  

has_many : の後ろのモデル名は、実はアクション名を指定しているだけ、デフォルトでそれと同じモデル名を探しにいくが、
オプションにクラス名を指定すると紐付けるモデルを指定できる
foreign_key(外部キー)=>relationshipモデルではない他のモデルのidを引用するためのものですというオプション
今回で言えばUserモデル(user.id)と関連付けられるのはこのカラムですという宣言をしているということ

belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"

relationship側で、follower_idはuser.idと紐づくというのを宣言している。
belongs_to :follower だと、デフォルトでfollowerモデルのidと関連づけられているという挙動になってしまうので、
class: "User"と指定することで、Userモデルのidと関連づけられていると指定できる。

belongs_to :user
=> user_id <-> Userクラスのidと紐付ける

belongs_to :follower, class_name: "User"
=> follower_id <-> followerクラスではなくUserクラスのidと紐付ける
#Userモデル
has_many :microposts
#class_name: "Micropost"
#foreign_key: "user_id" =>クラス名_id
#Micropostモデル
belongs_to :user
#user_idをUserのidと紐付ける