Size: a a a

Saint P Ruby Community

2021 March 02

v

vveare138 in Saint P Ruby Community
Nikita Bulai
ну это один запрос, это ок.

А мне надо сбилдить три: сортировка, пагинация, фиьтр
как дополнительные аргументы в метод репозитория
источник

NB

Nikita Bulai in Saint P Ruby Community
А можешь пояснить плиз? типо передавать dataset отфильтрованыный/спагинированный/etc ?
источник

NB

Nikita Bulai in Saint P Ruby Community
Мне почему-то это пахнет
источник

AD

Anton Davydov in Saint P Ruby Community
Nikita Bulai
Вопрос к тем, кто юзает паттерн репозиторий: как вы делаете фильтрации / сортировку / пагинацию? На уровне репозитория, где-то в ином месте? как это выглядит впринципе?

задача: получить список записей, у которых created_at > Time.now - 2.weeks, отсортировать их по created_at, спагинировать
Сортировка как обычно, фильтрация тоже (параметры же есть). А вот пагинация прямо боль, я так и не нашёл варианта, который мне бы понравился
источник

AD

Anton Davydov in Saint P Ruby Community
vveare138
я видел и работал с репозиториями которые возвращают датасет, поверх которого можно выше навернуть еще чего-нибудь, но это не совсем правильно
Все так
источник

NB

Nikita Bulai in Saint P Ruby Community
О, а можно псевдокод? я уже 5-й вариант накидываю, и всё меня бесит
источник

v

vveare138 in Saint P Ruby Community
вот да, выше юзер все правильно говорит
источник

v

vveare138 in Saint P Ruby Community
выглядит так себе, но по другому никак
источник

NB

Nikita Bulai in Saint P Ruby Community
Anton Davydov
Все так
а, стоп, то есть я возвращаю адасет и дальше юзают ORM метгды от него? ну такое
источник

v

vveare138 in Saint P Ruby Community
нет
источник

NB

Nikita Bulai in Saint P Ruby Community
типо

users = UserRepository.new.where_created_at(params[:created_at)
users = users.order().paginate() ?
источник

v

vveare138 in Saint P Ruby Community
возвращаешь коллекцию из метода репозитория
источник

v

vveare138 in Saint P Ruby Community
Nikita Bulai
типо

users = UserRepository.new.where_created_at(params[:created_at)
users = users.order().paginate() ?
user_repo.all(limit: 10, offset: 5, order: :created_at_asc)
источник

AD

Anton Davydov in Saint P Ruby Community
Nikita Bulai
а, стоп, то есть я возвращаю адасет и дальше юзают ORM метгды от него? ну такое
Не, я дошёл до того, что у меня репозиторий возвращает тапл из пейджера + данных
источник

AD

Anton Davydov in Saint P Ruby Community
А дальше в логике я загуливаю все как надо
источник

NB

Nikita Bulai in Saint P Ruby Community
vveare138
user_repo.all(limit: 10, offset: 5, order: :created_at_asc)
но это же не composable :( а еси я хочу навернуть на это ещё 10 дополнительных where ?
источник

v

vveare138 in Saint P Ruby Community
так он и не должен быть композабл
источник

v

vveare138 in Saint P Ruby Community
репозиторий так работает)
источник

NB

Nikita Bulai in Saint P Ruby Community
users = UserRepository.new
# тут надо отсортировать
# тут надо добавить where
# тут надо спагинировать

Я вот эти тра шага не понимаю как дожны быть реализованы на уровне репозитория (если не мутировать датасет, прилетевший в инициаизаторе)
источник

NB

Nikita Bulai in Saint P Ruby Community
vveare138
репозиторий так работает)
а, ок, то есть идея в том, чтобы всегда вызывать тока один метод у репозитория? а потом если надо, то вернуть датасет и в новом репозитории отсортировать и всё такое прочее?
источник