ЗАКАЗАТЬ номер в Postgres (Heroku) - PullRequest
0 голосов
/ 04 июня 2011

Следующий код работает для 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, я вижу, что псевдоним создается вокруг оператора ORDER BY, когда его не просят:

messages.recipient_id = (32))) AS id_list ORDER BY id_list.alias_0 DESC)

Мне не удалось найти обходной путь, за исключением использования "find_by_sql""для всего заявления - что требует значительных потерь в приложении.

1 Ответ

1 голос
/ 04 июня 2011

Не голосуйте за это, я пишу только потому, что публикация большого количества строк в комментариях не очень хорошо показывается.

Я бы написал «запрос, который возвращает сообщения, сгруппированные по их разговорному идентификатору, чтобы было показано последнее сообщение в каждом разговоре», например:

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. Если это вызывает ошибку, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...