2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby on Rails】Rails tutorial 14章 ステータスフィードの実装方法まとめ

Posted at

#はじめに
Rails tutorialに出てくるステータスフィードの実装が少しややこしかったので自分なりにまとめておきます。

#ステータスフィード
ステータスフィードとは、ツイッターなどでいうTL(tweet list)のことです。
フォローしているユーザーの投稿を表示することが可能です。

#実装方法
feedメソッドを作成します。

user.rb
#ステータスのフィードを返す。
def feed
end

はじめに結論から描きます。feedメソッドには以下のように記載します。

user.rb
#ステータスのフィードを返す。
  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

これだけ見てもワケワカリマセン。詳しく詳細を見ていきます。
まずは以下に着目します。

user.rb
    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変数フォローしているユーザー情報を取得することができます。

次に以下コードに着目します。

user.rb
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)

これはrailsのwhereメソッドを使っています。
whereメソッドでも使い方が少しややこしかったので整理していきます。

まずはINORを見ていきます。
IN複数の条件を定義するために使います。
以下に例を記載します。

#単体指定
#ageカラムが「20」のユーザーを取得します。
user = User.where("age = 20")

#複数指定
#ageカラムが「20と30」のユーザーを取得します。
user = User.where("age IN (20, 30)")

上のコードに戻ってみ考えてみると、、、
user_idの値が、先ほど定義したfollowing_ids(フォローしているユーザー一覧)のidの値の投稿を取得するということになります。

user.rb
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)であればその値を返すということになります。

user.rb
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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?