14章 ユーザーをフォローする
フォロー・フォロワーの関係について
followingデータベースを作ると無駄が多い。
relationshipsテーブルを作成する
has_many through
throughは多:多の関係時に使用。
「中間テーブル」です。
中間テーブルは、多対多の関係性を持つテーブルの間に位置し、双方の外部キーを持つ事で、どのデータと紐付いているか特定が可能になります。
user.rbでの
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
has_many :following, through: :active_relationships, source: :followed
は、userモデルがactive_relationshipsモデルを通して、followingモデルを所有している
中間テーブルがactive_relationships。
active_relationshipsとpassive_relationshipsの2つがある。
※関連付けに関しては以下リンクがわかりやすい
https://www.sejuku.net/blog/26617
ルーティングのネストした書き方
routes.rb
resources :users do member do get :following, :followers end end
の書き方は、
/users/1/following や /users/1/followersを表している?
一度に書けて便利的な
3つのhtml
_follow.html.erb ユーザーをフォローするフォーム
_unfollow.html.erb ユーザーをフォロー解除するフォーム
_follow_form.html.erb フォロー/フォロー解除フォームのパーシャル
の3つのhtmlが存在。
だからパーシャルってなんじゃ。
そして上の2つは表示画面が、ボタンしかないのかな
リスト 14.24: エラー
解決。user_controller.rbで
def following
とdef followersの定義し忘れ。
Aiax
JavaScriptとXMLを使って非同期にサーバとの間の通信を行うこと
非同期→画面が白くならずに変化する
respond_toメソッド
respond_to do |format| format.html { redirect_to user } format.js end
(ブロック内の) コードのうち、いずれかの1行が実行されるという点が重要
ステータスフィード作成にあたって
1) フォローしているユーザーのマイクロポストがフィードに含まれていること。
2) 自分自身のマイクロポストもフィードに含まれていること。
3) フォローしていないユーザーのマイクロポストがフィードに含まれていないこと
SQLを用いてやる。
フィード作成においては、
現在のユーザーに対応するユーザーidを持つマイクロポストを選択すればよかった。
実行方法: user.following
コレクションに対応するidを得るためには、関連付けの名前の末尾に_ids
を付け足すだけで済みます
# ユーザーのステータスフィードを返す def feed following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id" Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) end
不明