【问题标题】:ActionRecord modeling: Employee with many managersActionRecord 建模:拥有许多经理的员工
【发布时间】:2012-03-16 02:09:40
【问题描述】:

这应该很容易。我想我一定对命名很感兴趣。

“经理”和“下属”(员工)都属于“人员”类。

这是我所拥有的:

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

这对于检查和分配经理非常有用。

我对下属很感兴趣。它返回 Person 的自己,而不是他们的下属:

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 值似乎没有帮助。

有什么想法吗?

【问题讨论】:

  • 您的 PersonManagerAssignment 模型是什么样的?
  • 我已经进一步澄清了这个问题。我基本上需要控制在那个 WHERE 子句中使用哪个 ID。

标签: ruby-on-rails activerecord model


【解决方案1】:

答案基本上在这里: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

摇滚吧。

【讨论】:

  • 太棒了,谢谢!必须在 "has_many :subordinates" ":subordinate" 上创建 :source 并且必须保持 PersonManagerAssignment 与我之前的相同。
【解决方案2】:

我猜你的 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 :subordinates 应该按预期工作。

【讨论】:

  • 我在原始描述中添加了您的更改,但没有用。
  • Person 类中的 has_many :subordinates 似乎只在 Person 自身和 Person 的经理之间切换,但不能在 Person 自身被指定为经理的人之间切换。
  • 连接模型与其相交的模型具有belongs_to 关系
  • 啊,你是对的。好的,让我重新考虑一下并编辑我的问题,如果我没有从中弄清楚的话。谢谢!
【解决方案3】:
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

【讨论】:

  • 这基本上是我所拥有的,但是 Person.subordinates 返回他们自己或他们的经理,但不是正确的数据,这是所有将 Person 的自我作为经理的人,即 manager_id == self.id.
  • 我认为他的 PersonManagerAssignment 表架构需要将 :foreign_key =&gt; person_id 添加到 belongs_to :subordinate 调用中。
  • 我再次更新了我的问题以反映这一新信息。 Person.managers 有效,但 Person.subordinates 匹配 WHERE 子句中的错误值。有什么想法吗?
  • 你不应该需要:foreign_key =&gt; person_id,因为这是从 class_name => 'Person' 推断出来的
  • 我想我在任何地方都没有 :foreign_key => person_id。
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多