嵌套模型关联优化

时间:2020-02-20 14:24:28

标签: mysql activerecord ruby-on-rails-5.2

我嵌套的类别必须至少具有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

谢谢。

0 个答案:

没有答案
相关问题