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 オブジェクトを操作する場合、1 つのオプションは、メモを選択し、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)
これは、2 つのノートのand値DISTINCT ON
がまったく同じ場合に重複を削除するために使用されます。PostgreSQL を使用していない場合は、重複を処理する別の方法が必要になります。contact_id
created_at