Rails雇主和员工设计

Jab*_*Jab 3 ruby ruby-on-rails sti devise ruby-on-rails-3.1

我想弄清楚如何构建这个请帮助:我需要用户能够注册为雇主或员工.雇主基本上是公司,雇员是雇用该雇员的人.我想知道如何记录员工何时/是否被雇用并终止工作.has_many:through对于这个或更好的分配工作是否有一个我忽略的宝石可以帮助我这个?

xiy*_*xiy 7

这是分层对象模型的经典案例,因此您必须根据所涉及的对象及其相互关系来考虑此问题.想想企业在现实生活中的运作方式:

雇主 - >雇员不是雇主 - >经理等 - >雇员

这个系统模型的一个很好的例子是GitHub.在GitHub上,用户可以属于组织.他们还可以创建它们并管理它们,管理成员等(在您的情况下雇用和解雇).因此,对该系统进行建模的一种更好的方法是将其设置为以用户为中心,而不是将两个不同类别的用户分开.

如前面的答案中所述,雇主(或这个意义上的企业)不应被视为系统的用户,因为他们不会对程序的状态采取行动,用户会这样做.因此,我个人认为STI对于这个系统模型来说有点过分.

所以...

所有在企业就业人员是雇员,但不是所有的员工都在同一级别的权威(经理会比初级员工例如更多的权力).因此你应该建模a Business,它有很多 Employee s.这些Employee旨意有基于自己的立场不同权限级别:

  • can_hire?
  • can_fire?
  • 等等

您还可以创建一个方法,告诉您何时Employee雇佣/解雇.如果他们被雇用/解雇,或者nil如果没有,他们可以返回日期/时间.nil在这个意义上,显然意味着他们还没有被雇用/解雇.

在管理不同用户的能力时,他们的权限级别由他们能做什么和不能做什么来定义.您当然可以使用检查上述方法的简单方法将预设角色应用于此情况.例如:

def manager?
  self.can_hire? and self.can_fire?
end
Run Code Online (Sandbox Code Playgroud)

然后,您还将定义一种允许创建业务的能力:

def can_create_business?
  self.manager?
end
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用范围来优雅地实现此目的.

您还可以为角色的基本用户模型进行子类化,或者创建一个Role类,该类定义上述方法并对给定的User模型执行操作.然后,您可以创建角色的各个角色和子集.

可以说,在某些情况下,允许创建雇主/企业和雇员作为单独的实体,可以对计划的状态采取行动是有用的.如果Business能够执行的不仅仅是简单的管理功能,那么这可能是值得的.在这种情况下,我仍然不会将业务视为用户模型.我需要一个特殊的用户帐户与一起创建Business这将有一个角色Business Administrator或类似的东西.

这个模型遵循编程和计算机科学作为一个整体的一些最基本的原则,所以我希望它对你的问题有所了解.当然有许多可用的内置功能,即DeviseCanCan/CanTango,尽管我会亲自构建这个系统.