Я создаю простой форум как часть более крупного проекта, и одно из требований находится в списке форумов, мы показываем самую последнюю тему вместе с пользователем, который опубликовал эту тему.
Вот соответствующие модели, которые у меня есть:
Board
name
description
subjects_count
has_many Subjects
Subject
title
content
user_id
replies_count
belongs_to Board
belongs_to User
has_many Replies
Reply
content
belongs_to Subject
belongs_to User
User
name
has_many Subjects
has_many Replies
В индексном представлении досок для каждой активной доски отображаются следующие поля (вероятно, будет 5-10 досок):
board.name
board.description
subjects_count
most_recent_subject_title
most_recent_subject_id
most_recent_subject_user_name
Чтобы отобразить эту информацию, сейчас я использую метод ниже:
def get_boards_and_latest_subject
Board.connection.select_all("SELECT boards.id, boards.name, boards.description, subjects.id as most_recent_subject_id, subjects.title as most_recent_subject_title, subjects.user_id, subjects.created_at, users.name as most_recent_subject_user_name, users.id as user_id, (select count(id) FROM subjects where board_id = boards.id) as subject_count
FROM boards
INNER JOIN (SELECT board_id, MAX(created_at) MaxDate FROM subjects s GROUP BY board_id) MAXDATES
ON boards.id = MaxDates.board_id
INNER JOIN subjects ON MaxDates.board_id = subjects.board_id AND MaxDates.MaxDate = subjects.created_at
JOIN users ON subjects.user_id = users.id")
end
Я перенес этот SQL с платформы, с которой я начал этот проект - CodeIgniter, - но сейчас мне это кажется немного нелепым. В то время целью было уменьшить количество запросов при перечислении досок.
Учитывая количество досок, которые у меня есть (5-10), не лучше ли было бы сделать что-то большее, например, вернуть все доски в хороший вызов AR и для каждой, получить последнюю тему и пользователя?
Или другой вариант - сохранить последнюю тему в таблице досок, например, кеш счетчика. Поскольку я уже обновляю таблицу, когда добавляю тему - из-за кэша счетчика, было бы разумно также обновить последнюю информацию о субъекте?
Страница досок на существующем сегодня сайте, которую мы перестраиваем, в среднем составляет около 20 тыс. Просмотров страниц в месяц - так что это не очень большой трафик.