Rails 6中如何直接查询Project模型下所有嵌套关联的Document记录
方案1:通过has_many :through定义直通关联(推荐长期使用)
直接在Project模型中添加嵌套直通关联即可,Rails 6原生支持多层嵌套的through关联:
class Project < ApplicationRecord has_many :plans # 新增这一行,通过plans关联直通拿到所有documents has_many :documents, through: :plans end class Plan < ApplicationRecord belongs_to :project has_many :documents end class Document < ApplicationRecord belongs_to :plan end
定义完成后,直接对Project实例调用documents方法即可拿到对应项目下的所有Document记录,不会返回多余的Plan数据:
# 示例调用 project = Project.find(目标项目ID) project.documents # 返回该项目下所有关联的Document集合 # 需要预加载避免N+1查询时,直接写如下代码即可 Project.includes(:documents).find(目标项目ID)
方案2:临时查询(不需要修改模型定义)
如果只是临时需要查询某个项目下的Document,不想修改模型,可以直接使用关联查询语句:
# 替换下方的project_id为你要查询的项目ID Document.joins(plan: :project).where(projects: { id: project_id })
原代码问题说明
你之前使用的includes是Rails的预加载方法,作用是避免N+1查询,不会给模型新增关联方法;且你调用的Project.documents是对Project类调用方法,我们定义的关联是实例方法,需要对单个Project实例调用才会生效。
内容的提问来源于stack exchange,提问作者dace
相关产品推荐
相关产品推荐

