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
の変更内容は以下のようになります。
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
の変更内容は以下のようになります。
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
の変更内容は以下のようになります。
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行目です。ということは、想定通りの形でテストが落ちたと言えそうです。