心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。11.3章。

   


11.3ステータスフィード、です。

11.3.1動機と計画、です。

仕様

micropostの表示をフォローしているユーザーのものにします。twitterのタイムランと同じです。

user_feed

from_users_followed_byというメソッドを作って、あるユーザーによってフォローされているユーザーのマイクロポストをすべて見つけ出します。
Micropost.from_users_followed_by(user)

1) フォローしているユーザーのマイクロポストがフィードに含まれていること。
2) 自分自身のマイクロポストもフィードに含まれていること。
3) フォローしていないユーザーのマイクロポストがフィードに含まれていないこと。

テストを書く

リスト11.41 ステータスフィードの最終テスト。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  describe "micropost associations" do
    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end
略
    describe "status" do
      let(:unfollowed_post) do
        FactoryGirl.create(:micropost, user: FactoryGirl.create(:user))
      end
      let(:followed_user) { FactoryGirl.create(:user) }

      before do
        @user.follow!(followed_user)
        3.times { followed_user.microposts.create!(content: "Lorem ipsum") }
      end

      its(:feed) { should include(newer_micropost) }
      its(:feed) { should include(older_micropost) }
      its(:feed) { should_not include(unfollowed_post) }
      its(:feed) do
        followed_user.microposts.each do |micropost|
          should include(micropost)
        end
      end
    end
  end
略
end

実装する

リスト11.42 Userモデルに完全なフィードを追加する。
app/models/user.rb

class User < ActiveRecord::Base
略
  def feed
    Micropost.from_users_followed_by(self)
  end
略
end

11.3.2フィードを初めて実装する、です。

リスト11.43 from_users_followed_byの最初の実装。
app/models/micropost.rb

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

テストはパスします。

11.3.3サブセレクト、です。

リファクタリング

リスト11.44 from_users_followed_byを改良する。
app/models/micropost.rb

class Micropost < ActiveRecord::Base
略
  # 与えられたユーザーがフォローしているユーザー達のマイクロポストを返す。
  def self.from_users_followed_by(user)
    followed_user_ids = user.followed_user_ids
    where("user_id IN (:followed_user_ids) OR user_id = :user_id",
          followed_user_ids: followed_user_ids, user_id: user)
  end
end

リスト11.45 from_users_followed_byの最終的な実装。
app/models/micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order('created_at DESC') }
  validates :content, presence: true, length: { maximum: 140 }
  validates :user_id, presence: true

  # 与えられたユーザーがフォローしているユーザー達のマイクロポストを返す。
  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

11.3.4新しいステータスフィード、です。

リスト11.46 homeアクションにフィードのページネーションを追加する。
app/controllers/static_pages_controller.rb

class StaticPagesController < ApplicationController

  def home
    if signed_in?
      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end
略
end

11.4最後に、です。

git add .
git commit -m “Add user following”
git checkout master
git merge following-users

演習ありますが飛ばします。
これで終わりました。お疲れさまでした。ちょうど3週間かかってしまいました。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
RailsTutorial4.0を高速で復習する。6.3.5章。

6.3.5ユーザーを作成する、です。 userモデルはできています。開発用のデー …

no image
RailsGirlsMore!でRailsTutorialのキモチワルイところがスッキリしました

RailsGirls松江からのぉ〜東京More!*既に2回目から1ヶ月半。またま …

パーフェクトRuby 2章Rubyの基礎 2-6 モジュール

p57 2-6 モジュール 2-6-1モジュールの定義式 モジュールはインスタン …

no image
RailsTutorial4.0を高速で復習する。4.1章の途中から。

さて、4.1章の途中にある、変だなと思っている箇所、 リスト4.4 Homeペー …

RailsTutorial4.0を高速で復習する。またまた5.1.2章の途中から。

RailsTutorial4.0を高速で復習する。5.1.2章の途中から。です。 …

no image
Ruby on Railsのインストール

Rubyのアップデートが終わったので、いよいよRailsをインストールします。 …

no image
サーバー移転しました(2度目)

airpucci始まって2度目のサーバー移転しました。今まで入れていたプラグイン …

no image
RailsTutorial4.0を高速で復習する。6.2.2章。

6.2.2プレゼンスを検証する、です。いよいよモデルにコードを書いていきます。 …

no image
RailsTutorial4.0を高速で復習する。8.3章。

8.3Cucumberの紹介 (オプション) Cucumberは振舞駆動開発用の …

no image
MacBookAirで真央ちゃんのテレビ放映を見ました

テレビ持っていないを公言しています。 15年以上使っていたナショナル6型ブラウン …