Rails,自我加入的表,正确的创作方式

时间:2011-06-07 19:49:44

标签: ruby-on-rails

对于我的网络应用程序,我需要实现主管/学生关系。我需要通过“监督”表加入我的“人员”表。

class Person < ActiveRecord::Base

  has_many :supervised, :class_name => 'Supervision', :foreign_key => 'supervisor_id'
  has_many :supervisors, :class_name => 'Supervision', :foreign_key => 'supervised_id'

end

class Supervision < ActiveRecord::Base

  belongs_to :supervised, :class_name => 'Person'
  belongs_to :supervisor, :class_name => 'Person'
end

现在我需要有关控制器的帮助。我不确定我是否需要两个控制器,一个用于监督,一个用于监督,或者只需一个“监督”控制器。

学生和主管都必须能够创建“监督”。我只是不确定如何让控制器知道当前用户是否需要成为主管或学生。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以创建两个控制器,但这不是DRY,因此最好避免使用它。您可以设置路线,使Prof / Student的URL看起来不同,但实际上映射到同一个控制器。

教授有多少学生:

the_prof = Person.find( *my record number* )
the_prof.supervised.count

他们是谁同样的事情,所以显示他们的名字

the_prof.supervised.each do |student|
  puts student.name
end

如何确定谁是教授?我会在人员表中添加一个布尔标志:is_prof

我最初的想法是确定一个人是否是学生的方式是他们没有supervised。如果是一位教授,他们没有supervisor,但如果一位教授摆脱了他所有的学生或学生摆脱了他所有的教授,他就会崩溃。突然间,我们处于 undefined 的土地上,这是 BAD

该标志还可以轻松地将所有教授和学生分开,所以你可以做到

profs = Person.find_by_is_prof( true )
studs = Person.find_by_is_prof( false )

(确保在数据库中索引该字段)

答案 1 :(得分:0)

我猜你最终会制造至少两个控制器:一个是作为主管的人,一个是管理一个下属的人;和一个管理自己的人员记录。你甚至可能有另一个人管理一个人的注册,并允许他们选择他们的主管,作为一种向导式步骤的一部分。

通过勾画出一些线框,尝试模拟出你希望应用程序首先表现出来的行为。这些将帮助您确定哪些资源需要从哪里更改。

例如,如果您发现需要一个下属的列表,则可能是SubordinatesController #index页面。添加下属可能是该控制器中的#new / #create对。

控制器实际上是要弄清楚UI将如何响应不同的用户操作。设置/ my / supervisor,并注意到我/其他人/的主管可能在UI级别上有很多不同的东西。仅仅因为它们恰好位于同一个表中并不意味着UI必须反映这种对称性。

奇怪的是,人们可以更改自己的主管列表。我认为这就是问题的奇怪之处。

也许这实际上是改变其他成员资格的副作用,比如转移到组织中的不同组,在这种情况下,重新分配将成为其自己的控制器的一部分。