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), Но это на самом деле не решает проблему.

Лично я думаю, что было бы логичнее сохранить эту компанию <Ассоциация сотрудников. Слово "Сотрудник" подразумевает, что есть такой работодатель (может быть Компания, другое лицо, работающий не по найму или что-то еще), нанимающий этого Сотрудника.

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