チュートリアルをする。フィード(タイムライン)の作成
以下はチュートリアルをやってみたログである。railstutorial.jp
投稿(microposts)の中から自分のポストとフォローしたユーザのポストを選んで表示したい。Micropost.from_users_followed_by(user)のようなメソッドを実装することになる。これをフィードという名前で呼ぶことにし、Userクラスに実装する。
class User < ActiveRecord::Base ... def feed Micropost.from_users_followed_by(self) end ... end
Micropost.from_users_followed_by(user)の実装
sql文でいえば
SELECT * FROM microposts WHERE user_id IN (<list of ids>) OR user_id = <user id>
と書ける。これをrubyの記述で
class Micropost < ActiveRecord::Base ... def self.from_users_followed_by(user) followed_user_ids = user.followed_user_ids where("user_id IN (?) OR user_id = ?", followed_user_ids, user) end end
のように実装できる。
より効率的にする。
sql文でいえばサブセレクトを使う。
SELECT * FROM microposts WHERE user_id IN ( SELECT followed_id FROM relationships WHERE follower_id = 1) OR user_id = 1
この実装は
class Micropost < ActiveRecord::Base ... # 与えられたユーザーがフォローしているユーザー達のマイクロポストを返す。 def self.from_users_followed_by(user) followed_user_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id" where("user_id IN (#{followed_user_ids}) OR user_id = :user_id", user_id: user.id) end end
となる。