[英]Rails: order the results returned from DISTINCT ON * ORDER
我有以下 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)
它不會對第一個查詢的結果進行排序,它只是將順序附加到第一個查詢(我知道這是預期的行為),因此我沒有按創建日期獲得排序列表。 如何根據第一個查詢的結果進行排序? 基本上可以用 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.