首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails嵌套模型优化查询

Rails嵌套模型优化查询
EN

Stack Overflow用户
提问于 2015-04-29 19:58:42
回答 1查看 118关注 0票数 0

编辑:我使用Mongoid,所以没有链接,也没有has_many through:

我正在为项目管理开发一个后端,并且我有“深层次”的相关模型。

代码语言:javascript
复制
class Project
  include Mongoid::Document
  has_many :steps
  scope :active, ...

class Step
  has_many :assignments

class Assignment
  belongs_to :contractor, inverse_of: :project_assignment
  belongs_to :step

class Contractor
  belongs_to :user, inverse_of: :contractor_profile
  has_many :project_assignments, class_name: 'Assignment'

class User
  has_one :contractor_profile, class_name: 'Contractor'

现在,我已经为我的用户编写了一个侧栏。在这个侧边栏中,如果用户有一个承包商配置文件,我想显示活动项目的数量。

实现对这些信息的访问的最佳方式是什么?

我们讨论的可能是一次多达30个活动项目,每个项目从1到6个任务(但许多步骤与相同的承包商),承包商通常有几个项目的总和(活动与否)。

我的想法:

  • 查看current_contractor赋值、->步骤、->项目、->计数活动项目
  • 查看活动项目->赋值->找到与current_contractor匹配的承包人
  • 也许添加一个belong_to :project (如何确保它与self.step.project相同?)在每一项任务中,能够跳转承包商,->任务,->项目&计数
EN

回答 1

Stack Overflow用户

发布于 2015-04-30 02:13:06

不确定您是如何直接使用演示程序或视图的,但是从模型的角度来看,您应该能够将activerecord关联链接起来(听起来您已经想到了这一点)。例如

代码语言:javascript
复制
current_contractor.assignment.steps.projects.where(:status=>'active').count

您可以通过在项目模型中创建一个活动/非活动范围来稍微细化这一点,因此它将是

代码语言:javascript
复制
current_contractor.assignment.steps.projects.active.count

如果这类查询可能是常见的,我会考虑创建一个嵌套的has_many_through关系,以便从承包商到项目,例如在承包商定义中:

代码语言:javascript
复制
has_many :steps, 
       :through => :assignments
has_many :projects, :through => :steps

那你就可以

代码语言:javascript
复制
contractor.projects.count

或者如果您已经创建了项目活动/非活动作用域

代码语言:javascript
复制
contractor.projects.active.count

希望这有帮助

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29953344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档