具有唯一属性

时间:2015-11-19 08:56:31

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

简短说明:

我寻求建筑建议并帮助在单个应用程序中实现多个Devise模型。

更详细的解释:

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

有3种类型的用户(PartnerAttendeeSpeaker),其中包含一些常用字段和一些唯一字段(另外,字段可能具有不同的权限,即{{ 1}}必须有用户名,而Attendee可能有用户名,但他们不一定要填写此字段)。而且,不同的用户模型必须与db中的其他表具有不同的关联。

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

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

我的第二个虽然是在实施STI,在阅读了几篇关于它的文章之后,我尝试在代码中这样做。

我通过declarative_authorization生成了一个Devise User模型,然后运行rails g 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中创建任何新的AttendeeSpeakerPartner时,所有这三个模型都具有完全相同的字段,即{{1} } model has。

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

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

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

有没有人能详细解释我应该如何从头到尾实现这种行为和功能,以及在实施模型后我应该如何使用这些模型?

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

更新

记得另一个阻止我做角色分离的问题:

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

1 个答案:

答案 0 :(得分: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中创建单独的方法 - &gt; def register_user,def register_company,def register_xxxx