Activerecord 具有最新关联对象属性的活动记录联接

Activerecord 具有最新关联对象属性的活动记录联接,activerecord,rails-activerecord,Activerecord,Rails Activerecord,我有一个有很多注释的联系人模型。在我的应用程序的一个页面上,我显示了联系人列表的几个属性(姓名、电子邮件、最新创建的便条) 对于note列,我试图编写一个joins语句,该语句捕获所有联系人以及他们的最新便笺(甚至是创建的便笺) 我所提出的是错误的,因为它限制和订购联系人,而不是他们的笔记: current_user.contacts.joins(:notes).limit(1).order('created_at DESC') 如果您只想在处为每个联系人的最新便笺创建值,您可以首先创建一个查

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

对于note列,我试图编写一个joins语句,该语句捕获所有联系人以及他们的最新便笺(甚至是创建的便笺)

我所提出的是错误的,因为它限制和订购联系人,而不是他们的笔记:

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

如果您只想在处为每个联系人的最新便笺创建
值,您可以首先创建一个查询以查找最大值,然后加入该查询:

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")
如果要为最近的便笺使用便笺对象,一个选项是选择便笺并按
联系人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,以防两个便笺的
联系人id
创建值完全相同。如果您不使用PostgreSQL,则需要另一种方法来处理DUP