Rails: правильный вывод комментариев

программирование базы данных ruby ruby on rails rails

Подскажите, как правильно вывести комментарии к посту в 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))

Примечание:
Все-таки, я думаю, нужно будет прикручивать кеширование... И обновлять кеш после создания новых или обновления старых комментариев к посту.

Примечание:
Антон Витальевич (Антон Дьячук), опа, спасибо! Видимо, как раз то, что нужно!
Ответы:
@comments = @post.comments.join :user
@comments = @post.comments.includes :user
class Comment < ActiveRecord
belongs_to :posts, :counter_cache => true
will also reduse select count for comments, without using another caсhe systems exept rails "form the box" for now
use   config.cache_classes = true for rendering post with all comments from cache wile post or post.comments will be exired
u can use different cache store like redis or mem_cache
# Use a different cache store in production
# config.cache_store = :mem_cache_store


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.