はじめに
Rails tutorialに出てくるステータスフィードの実装が少しややこしかったので自分なりにまとめておきます。
ステータスフィード
ステータスフィードとは、ツイッターなどでいうTL(tweet list)のことです。
フォローしているユーザーの投稿を表示することが可能です。
実装方法
feedメソッドを作成します。
# ステータスのフィードを返す。
def feed
end
はじめに結論から描きます。feedメソッドには以下のように記載します。
# ステータスのフィードを返す。
  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
これだけ見てもワケワカリマセン。詳しく詳細を見ていきます。
まずは以下に着目します。
    following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id"
上記のコードは、SQL文で表されていてSELECTコマンドが使われています。
| SQLコマンド | 意味 | 
|---|---|
| SELECT | テーブルのデータを検索します。 | 
| SELECTコマンドのパラメータ | 意味 | 
|---|---|
| FROM | 対象となるソーステーブルを指定します。 | 
| WHERE | 取得したい値の条件を設定する | 
つまり、ここで何を意味しているかというと、、、
relationshipsテーブルのfollowed_idカラムがuser_idと一致しているユーザーを取得すると言う意味になります。following_ids変数フォローしているユーザー情報を取得することができます。
次に以下コードに着目します。
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
これはrailsのwhereメソッドを使っています。
whereメソッドでも使い方が少しややこしかったので整理していきます。
まずはINとORを見ていきます。
INは複数の条件を定義するために使います。
以下に例を記載します。
# 単体指定
# ageカラムが「20」のユーザーを取得します。
user = User.where("age = 20")
# 複数指定
# ageカラムが「20と30」のユーザーを取得します。
user = User.where("age IN (20, 30)")
上のコードに戻ってみ考えてみると、、、
user_idの値が、先ほど定義したfollowing_ids(フォローしているユーザー一覧)のidの値の投稿を取得するということになります。
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
次にORに着目していきます。
ORはどちらかの条件に一致するデータを取得するという意味です。
以下に例を記載します。
# nameカラムが「太郎」でageカラムが「20」のユーザーを取得します。
user = User.where("name = '太郎' and age = 20")
こちらも上のコードに戻って考えてみると、、、
user_idの値がfollowing_ids(フォローしているユーザー一覧)のidもしくは"id"(自分のid)であればその値を返すということになります。
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
ちなみにuser_id = :user_id", user_id: idの部分については、:で指定されている値が,後に指定されている値に代入されるというような挙動になっています。
# ageカラムが「20」のユーザーを取得します。
user = User.where("age = :xxx", xxx: 20)
# ageカラムが「20」のユーザーを取得します。
user = User.where("age = 20")
feedメソッドの理解はできました。
feedメソッドを以下のように使うと、ログインしているユーザーがフォローしているユーザーの投稿を取得することができます。
current_user.feed
参考文献
Rails tutorial 第14章 ユーザーをフォローする
https://.jp/chapters/following_users?version=6.0#sec-the_status_feed
Pikawaka 【Rails】whereメソッドを使って欲しいデータの取得をしよう!
https://pikawaka.com/rails/where
