Страницы

Поиск по вопросам

понедельник, 22 октября 2018 г.

Сортировка элементов в Ruby on Rails

Имеем два вложенных ресурса со связью has_many
#routes.rb
resources :topics do resources :posts end
Сортирую топики по последнему посту в нем:
Topic.includes(:posts).order("posts.created_at desc")
Как сделать чтобы новый созданный топик, который не имеет постов, был первым?


Ответ

Сделайте проще и логичнее -- сортируйте по дате последнего обновления топика, updated_at. При создании он сразу задаётся равным моменту создания, а заставить его следить за постами очень просто:
# Post belongs_to :topic, touch: true
Теперь при сохранении поста будет обновляться updated_at его топика, и для сортировки не потребуется лезть в ассоциацию вообще.
Если по каким-то причинам updated_at не может так себя вести, добавьте аналогичную колонку, а-ля last_posted_at и укажите её в виде символа вместо true, а при создании пишите туда значение created_at (способом на ваш выбор).
Об этой опции сказано здесь
Ещё один вариант -- делать заглавный пост топика при создании темы, тогда можно сразу сортировать по MAX(posts.created_at), ведь даже у новых топиков будет пост. Это потребует повозиться с вложенными атрибутами, зато не так избыточно.

Комментариев нет:

Отправить комментарий