3

我有一个有很多笔记的联系人模型。在我的应用程序的一个页面上,我显示了一个联系人表的几个属性(姓名、电子邮件、最新创建的笔记)。

对于 note 列,我正在尝试编写一个 join 语句来获取所有联系人以及他们的最新注释(甚至只是它的 created_at

我想出的是不正确的,因为它限制和订购联系人,而不是他们的笔记:

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

1 回答 1

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_idcreated_at值的情况下删除副本。如果您不使用 PostgreSQL,您将需要另一种方法来处理重复数据。

于 2015-06-04T09:50:52.837 回答