読者です 読者をやめる 読者になる 読者になる

Rodhos Soft

備忘録を兼ねた技術的なメモです。

チュートリアルをする。フィード(タイムライン)の作成

以下はチュートリアルをやってみたログである。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

となる。