Active Record加入最近的关联对象属性

时间:2013-03-27 20:46:52

标签: activerecord rails-activerecord

我有一个有许多Notes的Contact模型。在我的应用程序的一个页面上,我显示了联系人表的几个属性(名称,电子邮件,最新注释created_at)。

对于音符列,我正在尝试编写一个连接语句,它可以抓取所有联系人以及最新的音符(或者甚至只是它的created_at

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

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

1 个答案:

答案 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 ONcontact_id值,则会使用created_at删除重复项。如果你不使用PostgreSQL,你需要另一种方法来处理重复。