以下代码适用于Postgres(Heroku):
@messages = Message.select("DISTINCT
ON (messages.conversation_id)
*").where("messages.sender_id = (?) OR messages.recipient_id = (?)",
current_user.id, current_user.id)
然而,当试图通过添加.order("messages.read_at DESC")
来排序结果时,我收到以下错误:
ActionView::Template::Error (PGError: ERROR: column id_list.alias_0 does not exist)
在查看生成的SQL时,我看到在ORDERBY语句周围创建了一个别名,而不需要:
messages.recipient_id = (32))) AS id_list ORDER BY id_list.alias_0 DESC)
除了对整个语句使用"find_by_sql"之外,我一直想不出一个变通方法——这会给应用程序带来很大的损失。
不要投票,我只是因为在评论中发布了很多行并不能很好地显示而发布的。
我会写一个"查询,返回按conversation_id分组的消息,以便显示每个会话中的最后一条消息",如下所示:
SELECT m.*
FROM messages m
JOIN
( SELECT conversation_id
, MAX(created_date) AS maxdate
FROM messages
WHERE ...
GROUP BY conversation_id
) AS grp
ON grp.conversation_id = m.conversation_id
AND grp.maxdate = m.created_date
ORDER BY m.read_at DESC
不知道如何在Heroku中完成,也不知道是否可能,但它避免了DISTINCT ON
。如果这是导致错误的原因,可能会有所帮助。