2015-04-29 3 views
0

EDIT: Я не буду использовать Mongoid, так что нет цепочки, ни has_many through:Rails вложенные модели оптимизированы запрос

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

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 задания -> шаги -> Проекты -> COUNT активными
  • Посмотрите на активные проекты -> Назначения -> Найти подрядчиков, которые соответствуют current_contractor
  • Может быть добавить belong_to :project (как я могу убедиться, что это то же самое, что и у self.step.project?) в каждом задании, чтобы иметь возможность прыгать Подрядчик -> задания -> проекты & кол-во
+0

На самом деле, я пытаюсь моделировать 'has_many ххх хотя xxx' отношение, но с двумя моделями, участвующими в 'through' –

ответ

-2

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

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

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

current_contractor.assignment.steps.projects.active.count 

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

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

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

contractor.projects.count 

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

contractor.projects.active.count 

Надежда, что помогает

+0

О, извините, я добавил тег, но забыл упомянуть об этом в сообщении. Я использую Mongoid, а не ActiveRecord, поэтому нет 'has_many: through' :(И нет, к сожалению, я не могу связать ассоциации. Если я делаю' current_contractor.assignments.steps', я получаю «ActionView :: Template :: Error (undefined method 'assignments' для # ): ' –

+0

Это решение использует недействительные вызовы синтаксиса и ассоциации. –

Смежные вопросы