如何设置可用于作为员工的用户和作为客户的用户的用户模型?

时间:2017-01-20 03:13:42

标签: oop ruby-on-rails-4

Rails 4.2
Devise for Login
Pundit or CanCan for Authorization
Rolify for roles

我正在开发一个既有员工又有客户的应用程序:

Employees - can have 1 or more roles: Proofreader, Admin, Super Admin, Manager -  have an employee_profile

Clients - can purchase proofreading_jobs - have a client_profile

Employees that have role *proofreader* can have proofreading_jobs.


The client_profile contains different data from the employee_profile. 

我想使用最佳OO实践设计此应用程序,并使其具有可扩展性和灵活性,但我的经验有限。

我应该为员工和客户制作单独的模型,还是应该制作一个用户模型?

如果答案是一个用户模型,我如何区分应用程序中的员工和客户?

1 个答案:

答案 0 :(得分:2)

不幸的是,这是一个没有确定答案的问题之一,无论你对OOP有多少经验,你都有可能会出现问题。但是,在建模这样的东西时,有一些很好的概念和起点可供使用。

就个人而言,我认为Avdi Grimm has it right in this post并且我尽量避免使用通用"用户"在大多数情况下模型。 您可以使用UserAccount或Account模型来表示身份验证特定数据(用户名,密码),并且帐户具有配置文件(在您的情况下为客户端或员工)和角色(校对员,管理员,超级管理员...)。

那么,现在您的问题根本没有得到解答:您是否应该为员工和客户资料使用杰出模型? 这实际上取决于他们共享多少,如果它们几乎相同并且只能通过名称区分,则应考虑使用single table inheritance,如果它们只共享一些属性,那么您可以选择基本的Profile模型使用通用属性 - 您不希望拥有"属性"但是,这会与活动记录ActiveRecord::AttributeMethods#attributes发生冲突,所以你必须将它命名为ProfileAttribute或类似名称。

然而,问题可能在于你使用的宝石遵循不同的方法,并且很难让它们与我的想法一起工作,所以你需要一种更实用的方法。无论如何,这是可能的方法之一:

class Account < ActiveRecord::Base
  # Barebone account model:
  # id
  # username
  # password_hash

  has_many :roles
  has_one :profile # or has_many :profiles
end

class Profile < ActiveRecord::Base
  # Whatever attributes you want to have in both, client and employee profile,
  # for example:
  # id
  # public_name

  has_many :profile_attributes
  belongs_to :account
end

class ProfileAttribute < ActiveRecord::Base
  # This is pretty much as generic as it gets
  # id
  # name
  # value
  belongs_to :profile
end

这只是一个基本的想法,因为没有人对你的项目有足够的了解,就像我说的那样,所有答案都没有。希望这无论如何都有帮助。