回答編集履歴

2

画像を見て、また違う気がしたので修正します。度々すみません

2016/03/19 09:26

投稿

maisumakun
maisumakun

スコア145201

test CHANGED
@@ -1,9 +1,27 @@
1
- (includesも遅った&bulletも使用中ことなので、回答を修正します
1
+ `.count`を取るような場合、Active Recordだけは効率的にハンドリングしてくれないので、別途で`GROUP BY`をけて取得するほうがいい、いうことるケースもあります
2
2
 
3
3
 
4
4
 
5
+ ```ruby
6
+
5
- 全件取得のようにデタが多い場合、DB上で`JOIN`してくれる`.eager_load`を使うほうが、1度引きで済むのでいいかもしれません。
7
+ ## コントロラー側
6
8
 
7
9
 
8
10
 
11
+ @cheers_count = Cheer.group(:post_id).count
12
+
9
- [ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い](http://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)
13
+ @sympathies_count = Sympathy.group(:post_id).count
14
+
15
+
16
+
17
+ ## ビュー側
18
+
19
+ - posts.each do |post|
20
+
21
+ @cheers_count[post.id]
22
+
23
+ @sympathies_count[post.id]
24
+
25
+
26
+
27
+ ```

1

includesでも遅かったとのことなので、回答を修正します

2016/03/19 09:26

投稿

maisumakun
maisumakun

スコア145201

test CHANGED
@@ -1,9 +1,9 @@
1
- おそらく典型的な**N+1問題**と思われます
1
+ (includesでも遅かった&bulletも使用中とのことなので回答を修正します
2
2
 
3
3
 
4
4
 
5
- 対策としては、`Posts`の取得に`Post.all.includes(:cheers, :sympathies)`として対応する値まとめて取ってくる方法あり
5
+ 全件取得のようデータが多い場合、DB上で`JOIN`してくれる`.eager_load`を使うほう、1度引きで済むのでいいかもしれせん
6
6
 
7
7
 
8
8
 
9
- なお、N+1問題を検出するGemして[bullet](https://github.com/flyerhzm/bullet)というのがあります。
9
+ [ActiveRecordのjoinspreloadとincludesとeager_loadの違い](http://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)