Подскажите, как правильно вывести комментарии к посту в Rails?
Сейчас использую такой вариант: в контроллере posts в экшн show вывожу @comments = @post.comments, далее в виде вывожу комменты через @comments.each do |c|. Но... В цикле each я использую такие параметры как c.user, c.user.name и т.д. Таким образом при большом количестве комментариев заметно, как увеличивается время открытия страницы, т.к. выполняется куча подобных запросов:
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1
Пробовал в контроллере сразу организовать массив хешей с параметрами комментариев и авторов, но запросов меньше не стало.
Есть ли другие варианты вывода всех комментариев с наименьшим числом обращений к базе?
Примечание:
Антон Витальевич, спасибо! Первый вариант выдал ошибку, а вот второй прокатил. Правда, пока не заметил увеличения скорости открытия страницы с комментариями, однако, запросов к базе стало гораздо меньше. Вот список всех запросов:
Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 4 ORDER BY posts.created_at DESC LIMIT 1
User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
CACHE (0.0ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 4 ORDER BY posts.created_at DESC LIMIT 1
Category Load (0.3ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 3 LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
SQL (0.3ms) SELECT COUNT(DISTINCT `comments`.`id`) FROM `comments` LEFT OUTER JOIN `users` ON `users`.`id` = `comments`.`user_id` WHERE (`comments`.post_id = 4)
CACHE (0.0ms) SELECT COUNT(DISTINCT `comments`.`id`) FROM `comments` LEFT OUTER JOIN `users` ON `users`.`id` = `comments`.`user_id` WHERE (`comments`.post_id = 4)
Comment Load (0.6ms) SELECT `comments`.* FROM `comments` WHERE (`comments`.post_id = 4)
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` IN (1,4,5))
Примечание:
Все-таки, я думаю, нужно будет прикручивать кеширование... И обновлять кеш после создания новых или обновления старых комментариев к посту.
Примечание:
Антон Витальевич (Антон Дьячук), опа, спасибо! Видимо, как раз то, что нужно!
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.