【发布时间】:2020-09-28 03:42:32
【问题描述】:
在这种情况下如何正确使用includes来避免N + 1个查询:
我有一组可以嵌套的类别(即它们形成一棵树)。例如:
- 教学
- 课程1
- 办公时间
- 讲座
- 课程2
- 办公时间
- 讲座
- 课程1
- 研究
- 项目一
- 项目 2
- 服务
要设置此层次结构,每条Category 记录都有parent_id 作为外键。
这是我的 Rails 模型:
class Category < ApplicationRecord
belongs_to :user
belongs_to :parent, class_name: "Category", optional: true
has_many :children, class_name: "Category", foreign_key: "parent_id"
end
我使用访问给定用户的所有类别
@categories = Category.includes(:children).where(user_id: user.id)
但是,每次调用 @categories[i].children 都会生成一个新查询。
如何正确使用includes,以便无需额外查询即可访问每个类别的子类别。
(我也尝试了@categories = Category.where(user_id: user.id).includes(:children),但行为没有改变。)
【问题讨论】:
-
这是一个非常好的问题。在 rails 中默认使用
Category.include(:descendants)这样的东西会很好。
标签: ruby-on-rails activerecord select-n-plus-1