我的应用中有两个型号:
位置:
class Position < ActiveRecord::Base
belongs_to :report_to_position, class_name: 'Position', foreign_key: 'report_to_position_id'
has_many :employees
end
员工:
class Employee < ActiveRecord::Base
belongs_to :position
def boss
self.position.report_to_position.employee
end
end
正如您在boss
getter中所看到的,我需要在此关系中获得一个employee
。问题是Position
类有很多employees
。如何使用此模型逻辑获得一个对象(许多员工的老板)?
谢谢!
答案 0 :(得分:1)
您无法通过此关联设置获取 老板,但您可以获得 老板。那就是:你可以得到一个优越的。 Position
类has_many :employees
,它会给您带来两个问题:
Employee
课程中没有任何内容可以说&#34;这是我的直接上级&#34;。Position
课程中没有任何内容可以说&#34;这个人是老板&#34;。 那可能没事;如果可以获得给定Employee
的(基本上是随机的)上级,那么你的老板方法可以如下所示:
def boss
self.position.report_to_position.employees.first
end
但总的来说,我重新考虑您的架构。将组织结构图和员工数据分开是可以的,但是您应该考虑通过self join将老板/下属关联移到Employee
本身:
class Employee < ActiveRecord::Base
has_many :subordinates, class_name: "Employee", foreign_key: "boss_id"
belongs_to :boss, class_name: "Employee"
belongs_to :position
end
答案 1 :(得分:1)
<强>结构强>
为了帮助定义Alex P
的答案,您需要了解自己在中定义 {/ 1}}记录的方式。关联和表格。
我能看到的问题是因为你所有的boss
关联数据都是一样的,你无法确定谁是&#34;老板&#34;或不,因此你的问题
有两种方法可以确保您定义employee
关联 -
- 在
中boss
协会- 在数据库/
中 醇>ActiveRecord
-
<强>协会强>
执行此操作的最可靠方法可能是使用Model
,如association
所述:
Alex P
-
<强>模型强>
我这样做的方法是使用Ancestry
gem -
#app/models/employee.rb
Class Employee < ActiveRecord::Base
belongs_to :boss, class_name: "Employee"
has_one :boss, class_name: "Employee", foreign_key: "boss_id"
end
这必须与名为#app/models/employee.rb
Class Employee < ActiveRecord::Base
has_ancestry
end
(ancestry
)的数据表列相结合:
这将允许您为每个string
提供父(可能是老板或经理等)。这种设置的美妙之处在于你可以创造一个真正的树#34;结构 - 员工将能够根据需要拥有多名经理/老板