Ole*_*sko 1 postgresql activerecord ruby-on-rails
我有模型消息(id、文本、sender_id、recipient_id、created_at)。我只需要获取每个收件人 ID 范围内的最后一条记录。这就像在大多数带有所有对话的信使页面中一样。
例如,我有这个(收件人是 current_user):
id, sender_id, created_at
1, 1, 10.04.15
2, 1, 11.04.15
3, 2, 12.04.15
4, 3, 13.04.15
5, 2, 14.04.15
Run Code Online (Sandbox Code Playgroud)
通过查询,我只需要获取 ID 为 2、4、5 的值,按以下分组:
id, sender_id, created_at
2, 1, 11.04.15
4, 3, 13.04.15
5, 2, 14.04.15
Run Code Online (Sandbox Code Playgroud)
有了这个选择,我们就有了所有的记录,按用户分组:
Message.order(created_at: :desc).group_by(:sender_id)
Run Code Online (Sandbox Code Playgroud)
您可以在每个步骤中分解以下内容以查看输出是什么:
latest_ids = Message.group(:recipient_id).maximum(:id).values
Run Code Online (Sandbox Code Playgroud)
获得 ID 后,您可能想要获取记录:
Message.where(id: latest_ids)
Run Code Online (Sandbox Code Playgroud)
两个查询,是的,但这比可能涉及自己编写一些 SQL 的替代方案更清晰。