Интегрируйте 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 ответ

Прежде всего: ваш код крайне неэффективен, потому что:

  1. Он делает 3 запроса вместо 1
  2. Он загружает все записи в память (что может привести к сбою вашего сервера) и объединяет их в массив, используя еще больше памяти для создания еще одного, возможно, огромного объекта.
  3. Он использует , который никогда не должен использоваться таким образом

Итак, давайте начнем это менять.

  1. Не используй +но создайте единую область, которая объединяет 3 области действия (золото, серебро, план) вместе (это также должны быть отношения AR, а не буквальные запросы). Это даст вам одно отношение AR, которое еще ничего не загружает в память.
  2. Используйте связь AR напрямую с pagyвместо pagy_array: это вытянет только ту страницу записей, которая вам понадобится, а не всю кучу записей, которые вам не нужны
  3. Используйте одно и то же отношение AR для pagy_meilisearchи ваша проблема, вероятно, исчезнет без дальнейших изменений. Если это не так, то посмотрите на свой объем.
Другие вопросы по тегам