Rails: как использовать has_many в нескольких степенях разделения
У меня есть ряд модельных ассоциаций, использующих has_many
/ belongs_to
, следующее:
User
< Company
< Project
< Task
> Employee
> Company
(Круговой). Следующее:
Я установил связь между двумя моделями с 2 степенями разделения (например, Company
а также Task
) используя has_many :tasks, through: :projects
,
Можно ли также связать модели с несколькими (3 или более) степенями разделения (например, Company
с Employee
) таким образом? Так что я мог бы бросить Company
< Employee
(следовательно, круговая) ассоциация.
Цель состоит в том, чтобы иметь возможность сделать employee.company
доступно, при сохранении нового сотрудника из моего projects
контроллер.
2 ответа
Это возможно:
Например: Company
с Employee
class Company < ActiveRecord::Base
has_many :projects
has_many :tasks, through: :projects
has_many :employees, through: :tasks
end
Рельсы сделали волшебство с joins
запросы
Цель состоит в том, чтобы иметь возможность сделать employee.company доступной в модели Employee при сохранении нового сотрудника из контроллера моих проектов.
Это довольно точно, так как Employee
принадлежит Company
уже
Я не уверен, что вы можете сделать это без Компании <Ассоциация сотрудников, чтобы указать, какая компания наняла какого сотрудника.
Конечно, даже без Компании <Ассоциация сотрудников, вы все равно должны быть в состоянии назвать что-то вроде employee.projects.first.company
, Но без прямой связи, employee.company
это невозможно. Вам всегда нужно будет указывать, на какую компанию Проекта вы ссылаетесь, так как Projects имеет Employee has_many. Вы можете добавить метод в класс Employee для краткости, например:
def company(project)
project.company
end
и позвонить employee.company(@project)
, Но это на самом деле не решает проблему.
Лично я думаю, что было бы логичнее сохранить эту компанию <Ассоциация сотрудников. Слово "Сотрудник" подразумевает, что есть такой работодатель (может быть Компания, другое лицо, работающий не по найму или что-то еще), нанимающий этого Сотрудника.