Rails:对从 DISTINCT ON * ORDER 返回的结果进行排序

Dar*_*isa 0 activerecord ruby-on-rails

我有以下的Rails型号:ChatMessages其中一个聊天可以有很多的消息。我有以下 Rails 查询,可以为用户作为收件人的每次聊天提取最后一条消息:

def index
  messages = Message.where(recipient_id: id)
                    .select('DISTINCT ON ("chat_id") *')
                    .order(:chat_id, created_at)
end
Run Code Online (Sandbox Code Playgroud)

这为我提供了用户所在的每个聊天的用户的最后一条消息。我现在想按消息的创建时间对查询的结果进行排序,以便最新的消息显示在顶部。但是,如果我添加

sorted = messages.order(created_at: :desc)

它不会对第一个查询的结果进行排序,它只是将顺序附加到第一个查询(我知道这是预期的行为),因此我没有按创建日期获得排序列表。如何根据第一个查询的结果进行排序?基本上可以用 Rails 语法模仿以下内容:

SELECT *
FROM (SELECT DISTINCT ON (chat_id) *
      FROM messages
      ORDER BY chat_id, created_at DESC) last_messages
ORDER BY created_at DESC
Run Code Online (Sandbox Code Playgroud)

PGi*_*ill 5

尝试这个

Message.from(
  Message.where(recipient_id: id)
    .select('DISTINCT ON ("chat_id") *')
    .order("chat_id, created_at DESC"), 
    :messages
).order(created_at: :desc)
Run Code Online (Sandbox Code Playgroud)