Как я могу сортировать по created_at в этом запросе Rails

Учитывая следующий запрос AR для получения сообщений в виде разговоров (сгруппируйте их по sender_id), как я могу сначала отобразить последнее сообщение? Этот запрос отображает первое отправленное сообщение, но не самое последнее.

User.find(1).messages.select("DISTINCT ON (messages.sender_id(created_at)) * ")
  .where("messages.sender_id = (?)",friend.id)
  .group("messages.sender_id, messages.updated_at, messages.id, messages.user_id, messages.sent, messages.read")

Я немного потерялся в том, где и как добавить здесь пункт заказа.


person Martin    schedule 06.02.2013    source источник
comment
какой язык вы использовали для написания запроса? это не простой SQL   -  person NPKR    schedule 06.02.2013
comment
Извините, забыл добавить тег rails к вопросу.   -  person Martin    schedule 06.02.2013
comment
Попробуйте .order(created_at: "DESC") в конце   -  person weltschmerz    schedule 06.02.2013
comment
Кажется, это не работает.   -  person Martin    schedule 06.02.2013
comment
порядок не работает при использовании distinct по какой-то причине. Я не могу использовать группу без использования отдельных, так как это база данных postgres.   -  person Martin    schedule 06.02.2013


Ответы (1)


ORDER BY и DISTINCT не работают вместе.

Правильный способ сделать это — сделать вместо этого group by и order by.

Большая проблема в том, что SELECT * не работает с GROUP BY, поэтому вам придется отказаться от одного из:

  • GROUP BY
  • DISTINCT
  • ORDER BY

Один из вариантов: вы можете изменить SELECT *, чтобы перечислить все столбцы вручную, а те, которые не должны быть сгруппированы, можно поместить в агрегаты, такие как min() (что я и делаю в своих SQL-запросах.

Я не использую ORM, но, надеюсь, это даст вам представление о том, что делать, особенно. так как вы уже довольно близко к SQL в любом случае.

person Chris Travers    schedule 24.04.2013