我有一个有许多Notes的Contact模型。在我的应用程序的一个页面上,我显示了联系人表的几个属性(名称,电子邮件,最新注释created_at)。
对于音符列,我正在尝试编写一个连接语句,它可以抓取所有联系人以及最新的音符(或者甚至只是它的created_at
我提出的不正确,因为它限制和订购联系人,而不是他们的笔记:
current_user.contacts.joins(:notes).limit(1).order('created_at DESC')
答案 0 :(得分: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
和contact_id
值,则会使用created_at
删除重复项。如果你不使用PostgreSQL,你需要另一种方法来处理重复。