Интегрируйте pagy и meilisearch для разбиения на страницы и поиска в Rails.
Как лучше всего интегрировать pagy_search в мой индекс, если я уже использую Pagy? В моем контроллере у меня сейчас есть:
def index
@gold_drivers = Driver.gold_plan
@silver_drivers = Driver.silver_plan
@free_drivers = Driver.free_plan
@pagy, @drivers = pagy_array(
@gold_drivers + @silver_drivers + @free_drivers,
page: params[:page],
items: 16
)
if params[:query].present?
@drivers = @gold_drivers + @silver_drivers + @free_drivers
drivers_search = Driver.pagy_search(params[:query])
@pagy, @drivers = pagy_meilisearch(drivers_search, items: 25, page: params[:page])
end
end
У меня есть модель драйвера, которая делегирует модель профиля. К сожалению, когда я нажимаю поиск, я получаю
Driver#first_name delegated to profile.first_name, but profile is nil: #<Driver id: 224...
как я знаю, у этого драйвера нет профиля, но запуск запроса для @gold_drivers = Driver.gold_plan / @silver_drivers = Driver.silver_plan и т. д. не должен выбирать драйвер без профиля.
Запрос Driver.gold_plan:
find_by_sql("SELECT drivers.*, (profiles.no_races + profiles.no_poles + profiles.no_podiums + profiles.no_wins) AS scores FROM drivers INNER JOIN profiles ON profiles.driver_id = drivers.id INNER JOIN subscriptions ON subscriptions.driver_id = drivers.id WHERE subscriptions.status = 'active' AND profiles.first_name != null OR profiles.first_name != '' AND subscriptions.stripe_plan = '#{ENV["GOLD_ANNUAL"]}' OR subscriptions.stripe_plan = '#{ENV["GOLD_MONTH"]}' GROUP BY scores, drivers.id ORDER BY scores DESC")
В этом запросе я использую
"AND profiles.first_name != null OR profiles.first_name != ''"
который работает в разделе pagy_page, но не в разделе pagy_search.
Любое направление с этим приветствуется!
1 ответ
Прежде всего: ваш код крайне неэффективен, потому что:
- Он делает 3 запроса вместо 1
- Он загружает все записи в память (что может привести к сбою вашего сервера) и объединяет их в массив, используя еще больше памяти для создания еще одного, возможно, огромного объекта.
- Он использует , который никогда не должен использоваться таким образом
Итак, давайте начнем это менять.
- Не используй
+
но создайте единую область, которая объединяет 3 области действия (золото, серебро, план) вместе (это также должны быть отношения AR, а не буквальные запросы). Это даст вам одно отношение AR, которое еще ничего не загружает в память. - Используйте связь AR напрямую с
pagy
вместоpagy_array
: это вытянет только ту страницу записей, которая вам понадобится, а не всю кучу записей, которые вам не нужны - Используйте одно и то же отношение AR для
pagy_meilisearch
и ваша проблема, вероятно, исчезнет без дальнейших изменений. Если это не так, то посмотрите на свой объем.