Ребят, привет!
Подскажите пожалуйста, что почитать что бы построить на рельсах грамотный сложный поиск с учетом большого количества фильтров и разных моделей
Немного конкретезирую задачу(и попробую максимально ее упростить):
Есть три модели:
- Логи (небольшой кусочек информации: дата - что произошло - с кем произошло, и самое важно: успешно или нет). Обязательная связь со сценарием (т.е лог сам по себе существовать не может) и со Смотрителем
- Сценарии (содержат в себе инструкции кода, по результатам которых формируются логи. Сценарий так же знает: свое название, языковую версию, ожидаемый результат и т.д.).
- Смотритель. Создается перед запуском сценария, т.е. он точно знает: когда запустился сценарий, какой сценарий, какие получились логи для этого сценария. Ассоциируется со Сценарием, т.е для одного Смотрителя существует только один Сценарий
Оператору интересны только смотрители, т.е. на выходе он видит их список, языковые версии и результат логов, который я формирую как group(:inform).count (на выходе выглядит как "FATAL ERROR"=>1, "INFORM"=>11, "OK"=>22, "ERROR"=>3} )
В день может быть создано пару десятков Смотрителей, каждый из которых привязан к какому либо сценарию, каждый из которых генерит до полусотни логов. Не сложно спрогнозировать, что каждый месяц будет создоваться по 30 000 логов
Задача такая: построить фильтры для Смотрителя, что бы можно было сформулировать запрос примерно так:
Отобразить всех Смотрителей за такой то период (дата создания есть у смотрителя) для всех Сценариев на французском языке (локализация есть у Сценария) в логах которых встречается результат "FATAL ERROR" или "ERROR"(к примеру). Результат есть у логов, которые привязаны к этому смотрителю)
Итого один запрос задействует сразу три модели + потенциально этих записей(если быть точнее - то логов) могут быть десятки тысяч.
Я пока вижу два варианта решения:
Первый: join запрос (и можно ли такой запрос сделать срествами актив рекорд?)
Второй: разбить фильтры на части, т.е сперва выбирается период для Смотрителей - получаем массив, затем мы получаем локализацию через связи со Сценарием (и оставляем в массиве только те данные, которые соответсвуют запросу) а затем уже изучаем результаты логов через связи с логами. Результат выводим.
Вопросы:
что можно почитать по сложным выборкам?
Есть ли более лаконичное/правильное решение, чем я придумал?
Не будет ли большое количество данных вешать систему при выборочном поиске?
заранее спасибо, все кто откликнется получит в карму столько же, сколько за десять лайков на дорогах Бишкека в час пик