Страницы

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

суббота, 14 декабря 2019 г.

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

#ruby_on_rails #ruby


Имеем два вложенных ресурса со связью has_many

#routes.rb

resources :topics do
  resources :posts
end


Сортирую топики по последнему посту в нем:

Topic.includes(:posts).order("posts.created_at desc")


Как сделать чтобы новый созданный топик, который не имеет постов, был первым? 
    


Ответы

Ответ 1



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

Ответ 2



Зависит от БД. В Postgres есть NULLS FIRST, в MySQL нужно делать сортировку по вычисляемому полю (что-нибудь вроде ORDER BY posts.created_at IS NULL DESC, posts.created_at DESC)

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

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