Привет,
Я столкнулся с необычным запросом, и не совсем понимаю, как реализовать его, используя только SQL или ActiveRecord.
У меня есть темы с пользовательскими полями, и мне нужно сортировать данные по значению пользовательского поля ‘importedSortDate’.
Исходный код:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
Как я могу изменить или дополнить этот запрос, чтобы загрузить в память только эти 10 тем, а не больше?
Поскольку шаблон таблицы пользовательских полей немного странный — там есть колонка с именем и колонка со значением — я немного застрял, пытаясь понять, как именно реализовать это всё с помощью запроса к базе данных.
Моя проблема с загрузкой большего количества данных в память заключается в том, что для каждой загружаемой темы также выполняются запросы для получения категории, пользователя и поста.
Я работаю с 1000–2000 тем в каждой категории, и мне нужно получить данные из 4 категорий.
Этот запрос выполняется для всех пользователей, это не разовая операция.
На данный момент я вижу два способа решения (первый, похоже, недостаточно быстрый для меня):
- Получить только ID всех интересующих меня тем одним запросом, затем каким-то образом соединить эту информацию со значением ‘importedSortDate’, отсортировать данные в памяти, а затем снова выполнить запрос для получения тем в том же порядке (опять же, не совсем понимаю, как именно это реализовать).
- Как-то сформировать запрос с соединением (JOIN) с таблицей пользовательских полей (я видел примеры, но они были для фиксированных значений в колонках name и value) и отсортировать всё это на основе условий: колонка ‘name’ === ‘importedSortDate’ и колонка ‘value’ (строка в формате ISO8601).
Как мне этого добиться?
P.S. У некоторых тем может не быть значения в пользовательском поле importedSortDate. В таком случае я могу просто получить их и разместить где угодно, но это крайний случай, с которым я могу справиться. Если значения нет, такие темы должны быть первыми в списке.
PPS. В дальнейшем я хочу использовать этот запрос как основу для пагинации. Логика пагинации уже реализована, мне нужно лишь изменить основной запрос для получения тем.