2012-03-16 9 views
1

これは簡単です。私は命名に追いつく必要があると思う。ActionRecordモデリング:多くのマネージャーを持つ従業員

「マネージャ」と「下位」(従業員)の両方が「Person」クラスです。

は、ここで私が持っているものだ:

チェックや管理者を割り当てるための素晴らしい作品
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 

はどこそれが「PERSON_ID」一致のWHERE句でビットを参照してください?私はそれが "manager_id"であることが必要ですが、PersonManagerAssignment associations foreign_keyとprimary_key値を混乱させることは役に立たないようです。

アイデア?

+0

PersonManagerAssignmentモデルはどのように見えますか? – bblack

+0

それを追加しました。 – Christopher

+0

私はこの質問をさらに明確にしました。私は基本的にそのWHERE句でどのIDが使用されているかを制御する必要があります。 – Christopher

答えて

2

回答は基本的にここにある:上

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 

ロック:

http://railscasts.com/episodes/163-self-referential-associationは、だから私はあなたがこれを必要だと思います。

+0

華麗な、ありがとう! 「has_many:下位」「下位」のソースを作成しなければならず、以前と同じようにPersonManagerAssignmentを維持する必要がありました。 – Christopher

0

PersonManagerAssignmentテーブルにhas_one:personやhas_one:managerのようなperson_idとmanager_idとの関連付けがあることを推測します。その場合は、私はこの

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

、その後、あなたにhas_manyにこの関連

has_one :person 

を変更することはお勧めします:期待通りに部下が動作するはずです。

+0

変更内容を元の説明に追加しましたが、役に立たないようにしました。 – Christopher

+0

Personクラスのhas_many:従属者は、PersonセルとPersonのマネージャの間でのみ切り替えられるように見えますが、Personの自己がマネージャとして割り当てられている人は切り替えられません。 – Christopher

+1

結合モデルには、それが交差するモデルとの間に 'belongs_to'関係があります – dbenhur

0
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

これは基本的に私が持っているものですが、Personordinatesは自分自身またはマネージャーを返しますが、正しいデータではありません。これはPersonの自己をマネージャーとするすべての人物、つまりmanager_id == selfです。 id。 – Christopher

+0

彼のPersonManagerAssignmentテーブルスキーマは 'belongs_to:subordinate'呼び出しに':foreign_key => person_id'を追加する必要があると思います。 – bblack

+0

Personモデルの 'has_many:subordinates'のように? – bblack

関連する問題