Рельсы Каминари от оптимизации массива - PullRequest
0 голосов
/ 08 мая 2019

Проблема: У меня есть категории и продукты в категориях. Код / запросы очень медленные.

У каждой категории есть подкатегории, как у одной модели. У подкатегорий также есть продукты и, возможно, подкатегории. Поэтому мне нужно получить все товары всех подкатегорий при вызове родительской категории.

категория модели

  class Category < ApplicationRecord
      belongs_to :parent, polymorphic: true
      has_many :categories, as: :parent, :dependent => :destroy
      has_many :products, :dependent => :destroy

      def all_products
        @all_products = []
        all_products_find(self)
        return @all_products
      end

      def all_products_find(category)
        @all_products += category.products
        for cat in category.categories
          all_products_find(cat)
        end
      end
    ...
    end

Я использую Kaminari для разбиения массива на страницы, но перед его использованием категория помещает все продукты в массив, поэтому он очень длинный. Как я могу paginate_array, не собирая все продукты раньше?

действие моего контроллера

    @category = Category.find(params[:id])
    if !(@category.nil?)
      @products = @category.all_products #still gathering all products -> slow
      @products_part = Kaminari.paginate_array(@products).page(params[:page]).per(12)
    end

Как я могу его оптимизировать?

...