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实践设计此应用程序,并使其具有可扩展性和灵活性,但我的经验有限。
我应该为员工和客户制作单独的模型,还是应该制作一个用户模型?
如果答案是一个用户模型,我如何区分应用程序中的员工和客户?
答案 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
这只是一个基本的想法,因为没有人对你的项目有足够的了解,就像我说的那样,所有答案都没有。希望这无论如何都有帮助。