0
0

More than 3 years have passed since last update.

Railsチュートリアル 第14章 ユーザーをフォローする - 演習 「フィードを初めて実装する」

Last updated at Posted at 2020-02-27

1. リスト 14.44において、現在のユーザー自身の投稿を含めないようにするにはどうすれば良いでしょうか? また、そのような変更を加えると、リスト 14.42のどのテストが失敗するでしょうか?

「(フォローしているユーザーの投稿は含まれるが)現在のユーザー自身の投稿が含まれない」というのは、以下のようなSQL文になるはずです。

SELECT * FROM microposts
WHERE user_id IN (<list of ids>)

上記SQL文に対応するwhereメソッドの記述は、以下のようになります。

Micropost.where("user_id IN (?)", following_ids)

User#feedの変更内容は以下のようになります。

User#feed
  def feed
-   Micropost.where("user_id IN (?) OR user_id = ?", following_ids, id)
+   Micropost.where("user_id IN (?)", following_ids)
  end

上記のUser#feedの実装では、以下のテストが落ちるはずです。

# 自分自身の投稿を確認
rhakurei.microposts.each do |post_self|
  assert rhakurei.feed.include?(post_self)
end

私の環境では、上記のテストは、test/models/user_test.rbの105〜108行目に記述されています。

test/models/user_test.rbを対象として、実際にテストを実行してみます。

# rails test test/models/user_test.rb
Running via Spring preloader in process 217
Started with run options --seed 20808

 FAIL["test_feed_should_have_the_right_posts", UserTest, 0.9165929999999207]
 test_feed_should_have_the_right_posts#UserTest (0.92s)
        Expected false to be truthy.
        test/models/user_test.rb:107:in `block (2 levels) in <class:UserTest>'
        test/models/user_test.rb:106:in `block in <class:UserTest>'

  15/15: [=================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.26620s
15 tests, 29 assertions, 1 failures, 0 errors, 0 skips

失敗が発生したのは106行目と107行目です。ということは、想定通りの形でテストが落ちたと言えそうです。

2. リスト 14.44において、フォローしているユーザーの投稿を含めないようにするにはどうすれば良いでしょうか? また、そのような変更を加えると、リスト 14.42のどのテストが失敗するでしょうか?

「(自分自身の投稿は含まれるが)フォローしているユーザーの投稿が含まれない」というのは、以下のようなSQL文になるはずです。

SELECT * FROM microposts
WHERE user_id = <user id>

上記SQL文に対応するwhereメソッドの記述は、以下のようになります。

Micropost.where("user_id = ?", id)

User#feedの変更内容は以下のようになります。

User#feed
  def feed
-   Micropost.where("user_id IN (?) OR user_id = ?", following_ids, id)
+   Micropost.where("user_id = ?", id)
  end

(これって、本文14章「ステータスフィード」に取り掛かる前のUser#feedの実装内容と同じですよね)

上記のUser#feedの実装では、以下のテストが落ちるはずです。

# フォローしているユーザーの投稿を確認
rusami.microposts.each do |post_following|
  assert rhakurei.feed.include?(post_following)
end

私の環境では、上記のテストは、test/models/user_test.rbの101〜104行目に記述されています。

test/models/user_test.rbを対象として、実際にテストを実行してみます。

# rails test test/models/user_test.rb
Running via Spring preloader in process 230
Started with run options --seed 53063

 FAIL["test_feed_should_have_the_right_posts", UserTest, 2.1687096999994537]
 test_feed_should_have_the_right_posts#UserTest (2.17s)
        Expected false to be truthy.
        test/models/user_test.rb:103:in `block (2 levels) in <class:UserTest>'
        test/models/user_test.rb:102:in `block in <class:UserTest>'

  15/15: [=================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.66360s
15 tests, 27 assertions, 1 failures, 0 errors, 0 skips

失敗が発生したのは102行目と103行目です。ということは、想定通りの形でテストが落ちたと言えそうです。

3. リスト 14.44において、フォローしていないユーザーの投稿を含めるためにはどうすれば良いでしょうか? また、そのような変更を加えると、リスト 14.42のどのテストが失敗するでしょうか?

ヒント: 自分自身とフォローしているユーザー、そしてそれ以外という集合は、いったいどういった集合を表すのか考えてみてください。

「自分自身・自分をフォローしているユーザー・自分をフォローしていないユーザー全てのマイクロポストの集合」というのは、「全てのマイクロポスト」と等しくなります。以下のようなSQL文になるはずです。

SELECT * FROM microposts

上記SQL文に対応する記述は、以下のようになります。

Micropost.all
  end

User#feedの変更内容は以下のようになります。

User#feed
  def feed
-   Micropost.where("user_id IN (?) OR user_id = ?", following_ids, id)
+   Micropost.all
  end

上記のUser#feedの実装では、以下のテストが落ちるはずです。

# フォローしていないユーザーの投稿を確認
mkirisame.microposts.each do |post_unfollowed|
    assert_not rhakurei.feed.include?(post_unfollowed)
end

私の環境では、上記のテストは、test/models/user_test.rbの109〜112行目に記述されています。

test/models/user_test.rbを対象として、実際にテストを実行してみます。

# rails test test/models/user_test.rb
Running via Spring preloader in process 269
Started with run options --seed 15243

 FAIL["test_feed_should_have_the_right_posts", UserTest, 1.1897443999987445]
 test_feed_should_have_the_right_posts#UserTest (1.19s)
        Expected true to be nil or false
        test/models/user_test.rb:111:in `block (2 levels) in <class:UserTest>'
        test/models/user_test.rb:110:in `block in <class:UserTest>'

  15/15: [=================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.61430s
15 tests, 63 assertions, 1 failures, 0 errors, 0 skips

失敗が発生したのは110行目と111行目です。ということは、想定通りの形でテストが落ちたと言えそうです。

0
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
0
0