оптимизация ассоциации вложенных моделей - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть вложенные категории, которые должны иметь как минимум 3 или 4 подуровня. Я собираюсь запустить запрос MySQL, чтобы получить всех братьев и сестер из основной категории.

Я не использую ancestry gem.
Какой самый быстрый способ воспроизвести те же результаты без использования нескольких запросов ?

В настоящее время я выполняю 5 уровней со следующим кодом:

  def siblings
    c1 = self.categories.pluck(:id)
    c2 = Category.where('category_id IN (?)', c1).pluck(:id)
    c3 = Category.where('category_id IN (?)', c2).pluck(:id)
    c4 = Category.where('category_id IN (?)', c3).pluck(:id)
    c5 = Category.where('category_id IN (?)', c4).pluck(:id)

    cs = c1 + c2 + c3 + c4
    Category.where('id IN (?)', cs)
  end

Следующий набор запросов извлекает желаемый вывод коллекции, однако он будет медленным, если не будет кэширован.

В качестве примера следующий вывод из консоли:

pry(main)> Category.first.siblings.count
  Category Load (0.3ms)  SELECT  `categories`.* FROM `categories` ORDER BY `categories`.`id` ASC LIMIT 1
   (0.3ms)  SELECT `categories`.`id` FROM `categories` WHERE `categories`.`category_id` = 1
   (0.2ms)  SELECT `categories`.`id` FROM `categories` WHERE (category_id IN (6,7,8,9,10,11))
   (0.2ms)  SELECT `categories`.`id` FROM `categories` WHERE (category_id IN (21,22,23,24,25,26))
   (0.1ms)  SELECT `categories`.`id` FROM `categories` WHERE (category_id IN (NULL))
   (0.2ms)  SELECT `categories`.`id` FROM `categories` WHERE (category_id IN (NULL))
   (0.2ms)  SELECT COUNT(*) FROM `categories` WHERE (id IN (6,7,8,9,10,11,21,22,23,24,25,26))
=> 12

Это правильно.

Как я могу .include () бесконечно, или до желаемого глубокого уровня в том же самом модель ?

Мои ассоциации таковы:

belongs_to :category, class_name: 'Category', foreign_key: 'category_id', required: false
has_many :categories, :dependent => :destroy

Спасибо.

...