簡體   English   中英

Rails:對從 DISTINCT ON * ORDER 返回的結果進行排序

[英]Rails: order the results returned from DISTINCT ON * ORDER

我有以下 Rails 模型: ChatMessages ,其中一個聊天可以有很多消息。 我有以下 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)

它不會對第一個查詢的結果進行排序,它只是將順序附加到第一個查詢(我知道這是預期的行為),因此我沒有按創建日期獲得排序列表。 如何根據第一個查詢的結果進行排序? 基本上可以用 Rails 語法模仿以下內容:

SELECT *
FROM (SELECT DISTINCT ON (chat_id) *
      FROM messages
      ORDER BY chat_id, created_at DESC) last_messages
ORDER BY created_at DESC

嘗試這個

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

你可以做這樣的事情 -

def index
  messages = Message.where(recipient_id: id)
                .select('DISTINCT ON ("chat_id") *, created_at')
                .order(:chat_id, created_at)
                .sort_by(&:created_at).reverse
end

第一個選項是取消:order messages然后使用所需的列再次對其進行排序。

sorted = messages.unscope(:order).order(created_at: :desc)

如果您不能取消messages ,另一種選擇是將messages轉換為子查詢。

sorted = Message.where(id: messages).order(created_at: :desc)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM