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