【发布时间】:2020-02-17 14:09:55
【问题描述】:
我有以下 Rails 模型:Chat 和 Messages,其中聊天可以包含许多消息。我有以下 Rails 查询来从用户那里提取他作为收件人的每个聊天的最后一条消息:
def index
messages = Message.where(recipient_id: id)
.select('DISTINCT ON ("chat_id") *')
.order(:chat_id, created_at)
end
这向我提供了用户参与的每个聊天的最后一条消息。我现在想按创建消息的时间对该查询的结果进行排序,以便最新消息显示在顶部。但是,如果我添加
sorted = messages.order(created_at: :desc)
它不对第一个查询的结果进行排序,它只是将 order by 附加到第一个查询(我知道这是预期的行为),所以我没有按创建日期获得排序列表。如何对第一个查询的结果进行排序?基本上可以用 Rails 语法模仿以下内容:
SELECT *
FROM (SELECT DISTINCT ON (chat_id) *
FROM messages
ORDER BY chat_id, created_at DESC) last_messages
ORDER BY created_at DESC
【问题讨论】:
标签: ruby-on-rails activerecord