ロイの奮闘記録

PdMをやってるロイの日記です。人のつながりを増やしたいと思いながら、社会と奮闘しています

#32 7/22 14章 ユーザーをフォローする

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

https://ryoutaku-jo.hatenablog.com/entry/2019/05/05/%E5%A4%9A%E5%AF%BE%E5%A4%9A%E3%82%92%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E7%82%BA%E3%81%AE%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%EF%BC%88has_many_through%E3%80%81has_and_belongs_to_many%EF%BC%89

 

ルーティングのネストした書き方

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

JavaScriptXMLを使って非同期にサーバとの間の通信を行うこと

非同期→画面が白くならずに変化する

 

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

不明