Как упорядочить по "объединенному" create_at родительской и связанной модели (Ruby в Rails, SQLite) - PullRequest
0 голосов
/ 17 июня 2020
• 1000 1003 *

Итак, его следует упорядочить по последнему сообщению в ветке, включая само OP-сообщение потока.

Лучшее решение, которое я мог предложить после исследований и экспериментов:

topics.includes(:replies).order('replies.created_at DESC, topics.created_at DESC')

Но это сначала помещает потоки с ответами, потом потоки без ответов (даже если они создаются позже). Я могу сослаться на это topi c, мне нужно сделать то же самое, но в Rails + SQLite.

Пожалуйста, дайте какие-либо подсказки. Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июня 2020

После сеанса шаманизма программирования я получил решение.

На самом деле я просто взял этот ответ для SQL / PHP и преобразовал его в SQLite / Rails:

topics.left_joins(:replies).group('topics.id').order(
          'IFNULL(MAX(replies.created_at), topics.created_at) DESC')
1 голос
/ 17 июня 2020

Вы можете включить опцию touch ассоциации belongs_to:

class Reply
  belongs_to :topic, touch: true
end

Теперь каждый раз, когда создается ответ, атрибут updated_at модели Topi c будет обновляться .

Таким образом, вы можете просто отсортировать по столбцу updated_at таблицы тем:

topics.order(updated_at: :asc)
...