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

# 1. [リスト 14.44](https://railstutorial.jp/chapters/following_users?version=5.1#code-initial_working_feed)において、現在のユーザー自身の投稿を含めないようにするにはどうすれば良いでしょうか? また、そのような変更を加えると、[リスト 14.42](https://railstutorial.jp/chapters/following_users?version=5.1#code-full_feed_test)のどのテストが失敗するでしょうか?

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

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

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

```ruby:
Micropost.where("user_id IN (?)", following_ids)
```

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

```diff: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`の実装では、以下のテストが落ちるはずです。

```ruby:
# 自分自身の投稿を確認
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](https://railstutorial.jp/chapters/following_users?version=5.1#code-initial_working_feed)において、フォローしているユーザーの投稿を含めないようにするにはどうすれば良いでしょうか? また、そのような変更を加えると、[リスト 14.42](https://railstutorial.jp/chapters/following_users?version=5.1#code-full_feed_test)のどのテストが失敗するでしょうか?


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

```sql:
SELECT * FROM microposts
WHERE user_id = <user id>
```

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

```ruby:
Micropost.where("user_id = ?", id)
```

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

```diff: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`の実装では、以下のテストが落ちるはずです。

```ruby:
# フォローしているユーザーの投稿を確認
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](https://railstutorial.jp/chapters/following_users?version=5.1#code-initial_working_feed)において、フォローしていないユーザーの投稿を含めるためにはどうすれば良いでしょうか? また、そのような変更を加えると、[リスト 14.42](https://railstutorial.jp/chapters/following_users?version=5.1#code-full_feed_test)のどのテストが失敗するでしょうか?

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


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

```sql:
SELECT * FROM microposts
```

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

```ruby:
Micropost.all
  end
```

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

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

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

```ruby:
# フォローしていないユーザーの投稿を確認
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行目です。ということは、想定通りの形でテストが落ちたと言えそうです。