如果你只是想为最近音符为每个联系人的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
下降DUP的情况下两个音符具有完全相同的contact_id
和created_at
值。如果你不使用PostgreSQL,你需要另一种方式来处理dups。