Моделирование ActionRecord: сотрудник со многими менеджерами - PullRequest
1 голос
/ 16 марта 2012

Это должно быть легко. Я думаю, что должен быть увлечен именами.

И «менеджер», и «подчиненный» (работник) относятся к классу «Персона».

Вот что у меня есть:

class Person < ActiveRecord::Base
  has_many :person_manager_assignments
  has_many :managers, :through => :person_manager_assignments
  has_many :subordinates, :through => :person_manager_assignments
end

class PersonManagerAssignment < ActiveRecord::Base
  has_one :subordinate, :class_name => "Person", :foreign_key => "id", :primary_key => 'person_id'
  has_one :manager, :class_name => "Person", :foreign_key => "id", :primary_key => 'manager_id'
end

Что отлично подходит для проверки и назначения менеджеров.

Я пойман со стороны о подчиненных. Возвращает личность человека, а не его подчиненных:

p.subordinates
  Person Load (0.5ms)  SELECT "people".* FROM "people" INNER JOIN "person_manager_assignments" ON "people"."id" = "person_manager_assignments"."person_id" WHERE "person_manager_assignments"."person_id" = 15973

Посмотрите, где бит в предложении WHERE, где он соответствует "person_id"? Мне нужно, чтобы это было "manager_id", но, похоже, не помогает справка с ассоциативными значениями PersonManagerAssignment foreign_key и primary_key.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Ответ по существу здесь: http://railscasts.com/episodes/163-self-referential-association

Так что я думаю, что вам нужно это:

class Person < ActiveRecord::Base
  has_many :person_manager_assignments
  has_many :managers, :through => :person_manager_assignments
  has_many :subordinate_relationships, :class_name=>"PersonManagerAssignment", :foreign_key=>"manager_id"
  has_many :subordinates, :through => :subordinate_relationships, :source=>:person
end

и

class PersonManagerAssignment < ActiveRecord::Base
  belongs_to :person
  belongs_to :manager, :class_name=>"Person"
end

Rock on.

0 голосов
/ 16 марта 2012
class Person < ActiveRecord::Base
  has_many :subordinates :through => :person_manager_assignments
  has_many :managers,    :through => :person_manager_assignments
end

class PersonManagerAssignment < ActiveRecord::Base
  belongs_to :subordinate, :class_name => 'Person'
  belongs_to :manager,     :class_name => 'Person'
end
0 голосов
/ 16 марта 2012

Я собираюсь предположить, что в вашей таблице PersonManagerAssignment есть person_id и manager_id, а также ассоциации в модели, такие как has_one: person и has_one: manager.Если это так, я рекомендую изменить эту ассоциацию

has_one :person

на эту

has_one :subordinate, :class_name => "Person", :foreign_key => "person_id"

, и тогда ваши has_many: подчиненные должны работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...