Как я могу загрузить самый последний объект в отношении has_many? - PullRequest
3 голосов
/ 20 января 2011

У меня есть приложение rails 3, в котором есть модели, например категории и сообщения.

Категория

has_many: сообщения

Сообщение

принадлежат_категории: категория

Я хочу иметь возможность отображать список категорий с последним сообщением, перечисленным рядом с ним, не просматривая и не просматривая базу данных для каждой категории, а извлекая только одно сообщение для каждой категории.

Я хочу сделать то же самое, что и этот вопрос - SQL-соединение: выбор последних записей в отношении один-ко-многим - но, надеюсь, с использованием Active Record.

Это глупость?Должен ли я просто вернуть все сообщения для категории, стремясь загрузить их?Я был обеспокоен производительностью, поэтому я начал исследовать это.

1 Ответ

3 голосов
/ 20 января 2011

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

class Category < ActiveRecord::Base
  has_one :last_post, :class_name => "Post", :foreign_key => "category_id", :order => "created_at desc"
end

Затем вы можете использовать обычно:

Category.includes(:last_post).all

Но проблема в том, чтоSQL это генерирует, он по-прежнему выбирает все сообщения из категорий, даже если при вызове category.last_post он возвращает только последнее сообщение.Будет сгенерирован sql, подобный этому:

SELECT `categories`.* FROM `categories`
SELECT `posts`.* FROM `posts` WHERE (`posts`.category_id IN (1,2)) ORDER BY created_at desc
...