Ruby on Rails チュートリアルの第12章のメモです。チュートリアル最後の第12章では、Twitterのフォロー機能のようなものを作成します!フォローしているステータスのマイクロポストだけをページに表示するというステータスフィードやAjax処理を学ぶことができます!
第12章 ユーザーをフォローする | Rails チュートリアル
データモデルの設計方法メモ
Twitterのフォロー・フォロワー関係のデータモデルをどう設計するか
CalivenとHobbesがいるとする。CalivenがHobbesをフォローしている。逆から見ると、HobbesはCalivenからフォローされている。
Facebookのような友好関係(friendships)では本質的に左右対称のデータモデルが成立する。
が、Twitterのようなフォロー関係では左右非対称の性質がある
つまり、CaliveがフォローしていてもHobbesはCalivenをフォローしていない可能性がある。
左右非対称性な関係性を2つに分類し、能動的関係(Active Relationship)と受動的関係(Passive Relationship)とする
2つの関係を定義して、同じテーブルrelationships
を使って多対多のhas many through
を作っていく
複合キーインデックス
add_index :relationships, [:follower_id, :followed_id], unique: true
follower_id
とfollowed_id
の組み合わせが必ずユニークであることを保証する仕組み
これにより、あるユーザが同じユーザを2回以上フォローすることを防ぐことができる
belongs_to
関連付け
belongs_to
関連付けで指定するモデル名は必ず「単数形」にしなければならない
belongs_to
はモデルとモデルを「1対1」に関連付けする
UserとRelationの関連付けまとめ
User has_many :active_relations
ユーザはアクティブな(フォロー)関係をたくさんもっている
- アクティブをつけている理由は?
- passiveと対になっている
- activeはfollow、passiveはfollowed
- 使うクラス名はRelation
- 外部キーはfollower_id
- 削除依存あり(ユーザを消したら、ユーザが持つ関係も消す)
User has_many :passive_relations
ユーザはペイシブな(被フォロー)関係をたくさんもっている
Relationship belongs_to :follower
関係モデルはフォロワーに従属している
- ユーザをたくさんもっているにしてしまうと、フォローとフォロワーの区別ができない
- 使うクラス名はUser
- belongs_to
は外部キーいらない?
- follower_idに対して、必ず一つのユーザレコードが紐づくイメージ
Relationship belongs_to :followed
関係はフォロウドに従属している
followed_idに対して、必ず一つのユーザレコードが紐づくイメージ
User has_many :followeds, through: active_relationships
ユーザはアクティブな関係を通してたくさんのフォローを持っている
- following
に単数がないからfollowed
にしている
フォローしているユーザを直に扱うことができるようになる
user.following.include?(other_user)
user.following.find(other_user)
リダイレクトさせずにリクエストを送信する
Ajax
を利用する
Ajaxを利用することで、Webページからサーバに「非同期」で、ページを移動することなくリクエストを送信できる
Railsは以下のコードを書くだけで、簡単に自動的にAjaxを使用できる
form_for ...., remote: true
ステータスフィード
Railsチュートリアルの集大成
現在のユーザにフォローされているユーザのマイクロポストの配列を作成し、現在のユーザ自身のマイクロポストと合わせて表示
モチベーションと計画
テストで明確に書けそうだからテストコードから書いていく
以下の3つの条件を満たせば良さそう
1. フォローしているユーザのマイクロポストが含まれていること
2. 自分自身のマイクロポストもフィートにに含まれていること
3. フォローしていないユーザのマイクロポストがフィードに含まれていないこと
Ruby on Rails チュートリアル 「第12章 ユーザをフォローする」のまとめ
has_many :through
を使うと、複雑なデータ関係をモデリングできる- ルーティングはネストさせてつかうことができる
where
メソッドを使うと、より詳細なSQLを書いてDBにアクセスできる
かかった時間は3時間ほど
Ruby on Rails チュートリアル 全第12章にかかった合計時間は25時間