Оптимизированный запрос вложенных моделей Rails

РЕДАКТИРОВАТЬ: я использую Mongoid, так что ни цепи, ни has_many through:

Я разрабатываю бэкэнд для администрирования проекта, и у меня есть "глубоко" связанные модели

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?) в каждом назначении, чтобы иметь возможность перейти подрядчик -> задания -> проекты и количество

1 ответ

Не уверен, что вы используете презентацию или представление напрямую, но с точки зрения модели, вы должны быть в состоянии связать ассоциации activerecord (что, по вашему мнению, уже имеется в виду). Например

current_contractor.assignment.steps.projects.where(:status=>'active').count

Вы могли бы немного уточнить это, сделав активную / неактивную область действия в модели Projects, чтобы она была

current_contractor.assignment.steps.projects.active.count

Если этот тип запроса, вероятно, будет распространенным, я бы рассмотрел возможность создания вложенного отношения has_many_through для перехода от подрядчика к проектам, например, в определении подрядчика:

has_many :steps, 
       :through => :assignments
has_many :projects, :through => :steps

Тогда вы могли бы просто сделать

contractor.projects.count

или если вы создали проекты активных / неактивных областей

contractor.projects.active.count

надеюсь, это поможет

Другие вопросы по тегам