@vadimstroganov

Как правильно составить запрос?

Здравствуйте!
Имеется такая задача:
К примеру есть 10 записей в базе, таблице records

Мне нужно сделать выборку с offset=5, и выбрать после этого 2 записи, и вывести в порядке убывания created_at
Пробовал делать так:
Record.limit(2).offset(5).order(created_at :desc)
но в таком случае, он сначала сортирует все записи, 10,9,..1; после этого пропускает первые 5, и выдает мне записи с id=4 и id=3
а хотелось бы чтобы сортировка изначально была от 1 до 10, он пропустил первые 5, а потом вывел две записи в порядке убывания created_at, то есть записи с id=7 и id=6

Получилось только, если перебирать записи так:
Record.limit(2).offset(5).sort { |x,y| y.created_at <=> x.created_at }


А если записей будет очень много? Как можно сделать лучше?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
Получилось только, если перебирать записи так:
Record.limit(2).offset(5).sort { |x,y| y.created_at <=> x.created_at }

А если записей будет очень много?

Твой код правилен.
.limit() ограничивает количество записей, возвращаемых SQL БД, сортируя по primary ID, усли не указано другое. Так что никаких проблем с масштабируемостью здесь не должно быть.
Желательно ещё использовать .select() для избранных полей, чтобы ещё немного ускорить запрос.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Biggless
Post.where(id: Post.offset(5).limit(2)).order(created_at: :desc) ?
Ответ написан
ibub1ik
@ibub1ik
Ruby/Rails Dev => Elixir
Заниматься сортировкой на уровне приложения - ОЧЕНЬ плохо, надо стремиться делегировать максимум подобной работы БД. Попробуй так:
Post.from(Post.offset(5).limit(2)).order(created_at: :desc)

Возможно, я где-то ошибся, но копай в эту сторону в доках.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы