#はじめに
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