У меня есть вложенные категории, которые должны иметь как минимум 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
Спасибо.