简短解释:
我寻求架构建议和帮助在一个应用程序中实现多个设计模型。
更详细的解释:
我的应用程序需要执行以下行为:
有3种类型的用户(Partner、Attendee、Speaker),它们有一些公共字段和一些唯一的字段(此外,这些字段可能具有不同的权限,即Attendee必须有用户名,而Speaker可能有用户名,但他们不一定要填充这个字段)。而且,不同的用户模型必须与数据库中的其他表有不同的关联。
用户需要能够通过单个登录表单登录,但是登录表单应该是不同的。
所以,我的第一个想法是,我应该用Pundit或declarative_authorization之类的角色来划分用户,但是用户在应用程序中并没有真正的不同角色(即权限),他们有不同的行为,他们可能看到不同的内容和内容,所以我继续思考。
我的第二个想法是实现STI,在阅读了几篇关于STI的文章之后,我尝试用代码来实现它。
我通过执行User生成了一个Devise模型,然后运行了User,另外两个用户运行了相同的rails g model Attendee。
然后,我从User继承了我的模型
class Attendee < User
end我的User迁移如下所示:
create_table :users do |t|
t.string :first_name
t.string :last_name
t.string :type
# Devise stuff ...
..................
t.timestamps null: false
end其他移民是这样的:
create_table :attendees do |t|
t.string :username
t.string :company_name
t.boolean :subscription
t.timestamps null: false
end现在我意识到创建单独的表是错误的。我必须将所有可能的字段放入User表中,对吗?因为现在,当我试图在Attendee、Speaker或Partner中创建新的rails console时,这三个模型都有完全相同的字段,即User模型所具有的字段。
但是,如果我在User模型中添加了所有可能的字段,那么如何对实地存在执行验证呢?
我在这里读过不少文章和问题,但我仍然无法真正理解如何实现这一切。
不管怎样,这是做我需要的事的正确方法吗?
有谁能详细地解释一下我应该如何从头到尾实现这种行为和功能,以及在实现它们之后我应该如何处理这些模型?
更新
我想起了另一个阻止我进行角色分离的问题:
我应该如何用不同的注册表格注册不同的用户?不同的路线?我不能让用户从组合框中选择他们的角色。
发布于 2015-11-19 09:11:09
您可以根据角色创建条件验证规则,但首先需要解决的是新/编辑用户表单,仅根据角色动态显示允许的字段:
class User < ActiveRecord::Base
validates :company, presence: true, if: :is_company?
def is_company
# check for the role
self.role == 'company'
end
endUPDATE:您可以向相同的注册表单传递一个额外的参数,并使用它来区分所显示的表单的类型。这是最好的办法。您还可以在UserController -> def register_user、def register_company、def register_xxxx中创建单独的方法。
https://stackoverflow.com/questions/33799194
复制相似问题