2013-03-27 2 views
3

У меня есть модель контактов, в которой много примечаний. На одной странице моего приложения я показываю несколько атрибутов таблицы контактов (имя, адрес электронной почты, последняя заметка created_at).Активная запись Присоединиться к последнему атрибуту объекта ассоциации

Для столбца ноты, я пытаюсь написать заявление присоединяется, который захватывает все контакты вместе с только их последней нотой (или даже просто created_at его

То, что я пришел с некорректно, так как он ограничивает и упорядочивает контакты, а не их примечания:

current_user.contacts.joins(:notes).limit(1).order('created_at DESC') 

ответ

1

Если вы просто хотите, значение created_at для самой последней ноты для каждого контакта, вы можете сначала создать запрос, чтобы найти значение максимального, а затем присоединиться с этим запрос:

max_times = Note.group(:contact_id).select("contact_id, MAX(created_at) AS note_created_at").to_sql 
current_user.contacts.select("contacts.*, note_created_at").joins("LEFT JOIN (#{max_times}) max_times ON contacts.id = max_times.contact_id") 

Если вы хотите работать с объектом Note для самых последних заметок, одним из вариантов было бы выбрать ноты и сгруппировать их по contact_id. Затем вы можете прочитать их из хеша при работе с каждым контактом.

max_times = Note.group(:contact_id).select("contact_id, MAX(created_at) AS note_created_at").to_sql 
max_notes = Note.select("DISTINCT ON (notes.contact_id) notes.*").joins("INNER JOIN (#{max_times}) max_times ON notes.contact_id = max_times.contact_id AND notes.created_at = note_created_at").where(contact_id: current_user.contact_ids) 
max_notes.group_by(&:contact_id) 

Это использует DISTINCT ON падение Dups в случае, если две ноты имеют точно такие же contact_id и created_at значения. Если вы не используете PostgreSQL, вам понадобится другой способ борьбы с дублирующими устройствами.

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