Rails 3 HABTM Странная Ассоциация: Проект и Сотрудник в дереве - PullRequest
1 голос
/ 18 января 2011

Привет, ребята. Мне нужно адаптировать существующую модель к новым отношениям.У меня есть это:

В проекте много сотрудников.
Сотрудники проекта организованы в какой-то иерархии (ничего особенного, я решил это добавить parent_id для каждого сотрудника, чтобы построить «дерево»).)

class Employee < AR:Base
    belongs_to :project
    belongs_to :parent, :class_name => 'Employee'
    has_many :children, :class_name => 'Employee', :foreign_column => 'parent_id'  
end

class Project < AR:Base
   has_many :employees, 
end

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

Поэтому я думаю, что мне понадобится новая таблица для построения HABTM и новый класс для доступа к parent_id для построения дерева.Что-то вроде

class ProjectEmployee < AR:Base
   belongs_to :project
   belongs_to :employee
   belongs_to :parent, :class_name => 'Employee' # <--- ??????
end

class Project < AR:Base
   has_many :project_employee
   has_many :employees, :through => :project_employee
end

class Employee < AR:Base 
   has_many :project_employee
   has_many :projects, :through => :project_employee
end

Как я могу получить доступ к родительскому и дочерним элементам сотрудника для данного проекта?Мне нужно добавлять и удалять детей по желанию от сотрудников проекта.

Спасибо!

1 Ответ

1 голос
/ 18 января 2011

Пришлось переименовать вещи для лучшего различения, чувствует себя немного неуклюже ..

class Person < ActiveRecord::Base
  has_many :project_roles
  has_many :projects, :through => :project_roles
end

class Project < ActiveRecord::Base
  has_many :project_roles
  has_many :persons, :through => :project_roles
end

class ProjectRole < ActiveRecord::Base
  belongs_to :person
  belongs_to :project
  belongs_to :manager, :class_name => "ProjectRole"
  has_many :subordinates, :class_name => "ProjectRole", :foreign_key => "manager_id"
end

Учитывая некоторые существующие записи:

person = Person.first
project = Project.first
manager = project.project_roles.first

Добавление лица:

project.project_roles.create(:person => person, :manager => manager)

Удаление человека:

person.project_roles.find_by_project_id(project.id).destroy

- редактировать

Расширения ассоциации Rails могут здесь пригодиться.

...