Если вы просто хотите, значение 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, вам понадобится другой способ борьбы с дублирующими устройствами.