2011-01-20 2 views
3

У меня есть приложение для рельсов 3, которое имеет модели, такие как категории и сообщения.Как я могу загрузить самый последний объект в отношениях has_many?

Категория

has_many: Сообщений

Сообщение

belongs_to: категория

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

Я хочу сделать то же самое, этот вопрос задает - SQL join: selecting the last records in a one-to-many relationship - но мы надеемся, используя активную запись.

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

ответ

3

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

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 
+0

Спасибо за ответ - так, на ваш взгляд, лучше ли просто строить запрос для такого рода вещей? – someoneinomaha

 Смежные вопросы

  • Нет связанных вопросов^_^