Оптимизированный запрос вложенных моделей 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
надеюсь, это поможет