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と紐付ける