【发布时间】:2011-10-26 19:18:03
【问题描述】:
在设计此应用程序时,我一直在尝试不同的技术,这对我来说非常复杂,因为有很多解决方案可供选择。在过去的几周里,决定哪种解决方案最好已经成为我的全职工作。
背景:
我有一个User 模型,其中包含一些非常基本的身份验证功能。该应用程序将拥有三种不同类型的用户;管理员、买家和卖家。用户类型将在注册期间确定,其中一个复选框将询问用户是否是卖家。如果选中该框,则用户是卖家,如果未选中该框,则假定他们只是买家。我宁愿没有下拉菜单来选择用户类型(买家、卖家)。到目前为止很容易。
详情:
卖家拥有个人资料,访问该网站的用户将能够浏览不同的卖家并查看他们的个人资料。买家没有个人资料,不应在网站上列出供用户查看。如果这还不够复杂,买家应该可以选择更改他们的账户类型并成为卖家。同样,卖家可以更改他们的账户类型并“停用”他们的卖家账户,将其从卖家列表中删除。
设计选项:
单表继承:
我在尝试使用 STI 实现这一点时所想出的并不是最理想的。我面临两个选择:一个凌乱的控制器,它根据上面提到的复选框(一个控制器 - UsersController)决定创建什么类型的用户,或者两个相同的不同注册表单(两个控制器 - BuyersController , SellersController)。
has_one 或“has_none”个人资料关联:
class User < ActiveRecord::Base
has_one :profile # only if the user_type or role is "seller"
end
class Profile < ActiveRecord::Base
belongs_to :user
end
这里我会使用 CanCan 或 declarative_authorization 之类的东西,并让用户通过上面提到的复选框选择他/她的角色。这会带来安全风险,因为会有一个管理员角色,我不希望它对批量分配开放。
我猜无论你怎么看,我都会有一个杂乱无章的控制器,其中包含有关如何创建用户的条件。除非我选择有两个复选框(“我是卖家”和“我是买家”),但这似乎是多余的。似乎无论我选择哪种设计,我都会面临一些骇人听闻的解决方案。
也许介绍一些介于User 和用户类型之间的模型?
有什么意见吗?
【问题讨论】:
-
请注意,建议进行编辑,将您对“身份验证”一词的使用更改为“授权”。我相信更正是准确的,但在这种情况下,IMO 最好由您决定。
-
(我还要补充一点,您之前的明显相关问题改变了这个问题的性质及其最佳答案。也就是说,我仍然不确定有什么大不了的——如果你想从一个表单创建用户,这不是很多额外的工作,你知道吗?)
-
我正在考虑链接到我以前的问题。但是,这个问题对应用程序需要做什么有更准确和准确的描述。如果可以,我会扔掉旧的。另外,您是指我在用户模型的描述中使用“身份验证”一词吗?用户模型中没有授权(还)。感谢您的 cmets!
-
我认为原编辑只是指出,如果有身份验证,这无关紧要,讨论的重点是授权,仅此而已。
标签: ruby-on-rails ruby-on-rails-3