質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

487閲覧

has_manyしている要素のカウント(size)のN+1問題に対処したい

JuniorSirius

総合スコア38

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/29 21:23

日記リソースdiaryの一覧をパーシャルでrender(_diary.html.slim)で出力します。
そのパーシャル内にいいね数(has_many :likes)を出力する内容となっており、

_diary.html.slim

ruby

1= diary.likes.size

コントローラーにおいては
diaries_controller.rb

ruby

1@diaries = Diary.all.includes(:user, :likes).order(created_at: :desc)

としていますが= render 'diaries'とする度にSQLが_diaryごとに以下のように発行されてしまいます。
どのように対処すればいいのでしょうか、Gemは使わないようにしたいです。

ちなみにDockerの開発環境に変えて実行しているので、コンテナをまたぐことによってローカルの頃と比べて、問い合わせによる時間がかかりすぎて気になりました。

(0.7ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`diary_id` = 35 ↳ app/views/diaries/_unlike.html.slim:4 Rendered diaries/_unlike.html.slim (11.7ms) Rendered diaries/_like_area.html.slim (418.6ms) Rendered diaries/_diary.html.slim (869.4ms) Diary Exists (0.6ms) SELECT 1 AS one FROM `diaries` INNER JOIN `likes` ON `diaries`.`id` = `likes`.`diary_id` WHERE `likes`.`user_id` = 2 AND `diaries`.`id` = 34 LIMIT 1 ↳ app/models/user.rb:89 (0.7ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`diary_id` = 34 ↳ app/views/diaries/_like.html.slim:4 Rendered diaries/_like.html.slim (9.0ms) Rendered diaries/_like_area.html.slim (346.5ms) Rendered diaries/_diary.html.slim (715.3ms) Diary Exists (0.9ms) SELECT 1 AS one FROM `diaries` INNER JOIN `likes` ON `diaries`.`id` = `likes`.`diary_id` WHERE `likes`.`user_id` = 2 AND `diaries`.`id` = 33 LIMIT 1 ↳ app/models/user.rb:89 (2.4ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`diary_id` = 33 ↳ app/views/diaries/_like.html.slim:4 Rendered diaries/_like.html.slim (6.0ms) Rendered diaries/_like_area.html.slim (417.7ms) Rendered diaries/_diary.html.slim (907.2ms) Diary Exists (0.6ms) SELECT 1 AS one FROM `diaries` INNER JOIN `likes` ON `diaries`.`id` = `likes`.`diary_id` WHERE `likes`.`user_id` = 2 AND `diaries`.`id` = 32 LIMIT 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2021/12/29 21:58

partialをどう呼び出してますか
JuniorSirius

2021/12/29 22:01

ありがとうございます。 `diaries/index.html.slim`にて - set_meta_tags title: '最新ダイアリーページ' .wrapper.py-5 h2.text-center.mb-5 #{ @title } #diaries = render 'diaries' としています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問