gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:10:13 25 4
gpt4 key购买 nike

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

对于笔记列,我正在尝试编写一个连接语句来获取所有联系人以及他们的最新笔记(或者甚至只是它的 created_at

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

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

最佳答案

如果您只想要每个联系人的最新注释的 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)

如果两个笔记具有完全相同的 contact_idcreated_at 值,这将使用 DISTINCT ON 来删除重复项。如果您不使用 PostgreSQL,则需要另一种方法来处理重复数据。

关于activerecord - Active Record 加入最近的关联对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com