首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有独特属性的多个设计模型

具有独特属性的多个设计模型
EN

Stack Overflow用户
提问于 2015-11-19 08:56:30
回答 1查看 160关注 0票数 0

简短解释:

我寻求架构建议和帮助在一个应用程序中实现多个设计模型。

更详细的解释:

我的应用程序需要执行以下行为:

有3种类型的用户(PartnerAttendeeSpeaker),它们有一些公共字段和一些唯一的字段(此外,这些字段可能具有不同的权限,即Attendee必须有用户名,而Speaker可能有用户名,但他们不一定要填充这个字段)。而且,不同的用户模型必须与数据库中的其他表有不同的关联。

用户需要能够通过单个登录表单登录,但是登录表单应该是不同的。

所以,我的第一个想法是,我应该用Punditdeclarative_authorization之类的角色来划分用户,但是用户在应用程序中并没有真正的不同角色(即权限),他们有不同的行为,他们可能看到不同的内容和内容,所以我继续思考。

我的第二个想法是实现STI,在阅读了几篇关于STI的文章之后,我尝试用代码来实现它。

我通过执行User生成了一个Devise模型,然后运行了User,另外两个用户运行了相同的rails g model Attendee

然后,我从User继承了我的模型

代码语言:javascript
复制
class Attendee < User
end

我的User迁移如下所示:

代码语言:javascript
复制
create_table :users do |t|
  t.string :first_name
  t.string :last_name
  t.string :type

  # Devise stuff ...
  ..................

  t.timestamps null: false
end

其他移民是这样的:

代码语言:javascript
复制
create_table :attendees do |t|
  t.string :username
  t.string :company_name
  t.boolean :subscription

  t.timestamps null: false
end

现在我意识到创建单独的表是错误的。我必须将所有可能的字段放入User表中,对吗?因为现在,当我试图在AttendeeSpeakerPartner中创建新的rails console时,这三个模型都有完全相同的字段,即User模型所具有的字段。

但是,如果我在User模型中添加了所有可能的字段,那么如何对实地存在执行验证呢?

我在这里读过不少文章和问题,但我仍然无法真正理解如何实现这一切。

不管怎样,这是做我需要的事的正确方法吗?

有谁能详细地解释一下我应该如何从头到尾实现这种行为和功能,以及在实现它们之后我应该如何处理这些模型?

PS:这是我的迁徙史和整个github回购

更新

我想起了另一个阻止我进行角色分离的问题:

我应该如何用不同的注册表格注册不同的用户?不同的路线?我不能让用户从组合框中选择他们的角色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-19 09:11:09

您可以根据角色创建条件验证规则,但首先需要解决的是新/编辑用户表单,仅根据角色动态显示允许的字段:

代码语言:javascript
复制
class User < ActiveRecord::Base
  validates :company, presence: true, if: :is_company?

  def is_company
   # check for the role
   self.role == 'company'
  end
end

UPDATE:您可以向相同的注册表单传递一个额外的参数,并使用它来区分所显示的表单的类型。这是最好的办法。您还可以在UserController -> def register_user、def register_company、def register_xxxx中创建单独的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33799194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档