【问题标题】:Multiple Devise models with unique attributes具有独特属性的多个设计模型
【发布时间】:2015-11-19 17:19:35
【问题描述】:

简短说明:

我寻求架构建议和帮助,以在单个应用中实现多个 Devise 模型。

更详细的解释:

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

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

用户需要能够通过单一登录表单登录,但注册表应该不同。

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

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

我通过执行rails g devise User 生成了一个设计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 表中,对吗? 因为现在当我尝试在rails console 中创建任何新的AttendeeSpeakerPartner 时,所有这三个模型都有完全相同的字段,User 模型有。

但如果我在 User 模型中添加所有可能的字段,我将如何对字段存在进行验证?


我已经阅读了很多关于 SO 的文章和问题,但仍然无法真正理解如何实现所有这些。

无论如何,这是做我需要的正确方法吗?

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

PS:这里是history of my migrations 和整个github repo


更新

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

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

【问题讨论】:

  • 对我来说,这听起来像是代码重复……创建基于角色的系统并根据角色允许/禁止某些字段不是更容易吗? (看看 Rolify 宝石)
  • 哦,抱歉,您已经得出结论...您可以在 before_validation 中检查角色。我将在下面放一些示例代码
  • @bo-oz 是的,我也是这么想的。这就是为什么我决定向更有经验的开发人员寻求建议。
  • 查看我下面的 sn-p 以快速了解条件验证。

标签: ruby-on-rails-4 devise single-table-inheritance sti multiple-users


【解决方案1】:

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

class User < ActiveRecord::Base
  validates :company, presence: true, if: :is_company?

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

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

【讨论】:

  • 感谢有用的 sn-p!那么,您建议我将所有可能的字段放在一个 User 表中并仅划分角色?
  • 这完全取决于您之后要创建的功能。公司需要另一种模型听起来似乎是合理的......不要认为编程明智,认为功能或对象明智。公司与自然人不同。也许公司将来需要多个用户……那你就完蛋了!
  • 如果您愿意,您可以拥有多个设计模型...您只需要确定适合您的特定应用的最佳解决方案。根据您提供的信息,我无法确定这一点。只是演讲者和合作伙伴对我来说听起来像是一种特殊类型的用户。如果他们是自然奇异的人,那么他们完全适合一个用户模型。如果您有各种特殊功能或其他关系,它们中的每一个都独占,那么将它们分开是最好的解决方案。
猜你喜欢
  • 2014-04-10
  • 2016-12-31
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
相关资源
最近更新 更多