Ruby on Rails

【Ruby on Rails】チュートリアル 「第12章 ユーザをフォローする」をやってみた

Ruby on Rails チュートリアルの第12章のメモです。チュートリアル最後の第12章では、Twitterのフォロー機能のようなものを作成します!フォローしているステータスのマイクロポストだけをページに表示するというステータスフィードやAjax処理を学ぶことができます!

第12章 ユーザーをフォローする | Rails チュートリアル

Railsチュートリアル第12章をやってみた

データモデルの設計方法メモ

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_idfollowed_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時間

-Ruby on Rails