2013-03-27 79 views
3

我有一个联系人模型,它有很多注释。在我的应用程序的一页上,我显示了联系人表格的几个属性(名称,电子邮件,最新注释created_at)。活动记录加入最新的联系人对象属性

对于备注栏,我试图写一个连接,抓住所有的联系人,只需他们最新的笔记(或者甚至只是它

的created_at我想出一起说法是不正确的它限制并命令接触,而不是他们的笔记:

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

回答

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下降DUP的情况下两个音符具有完全相同的contact_idcreated_at值。如果你不使用PostgreSQL,你需要另一种方式来处理dups。