设计(STI)使用其先前的凭据创建另一个用户帐户类型

时间:2014-01-13 06:52:05

标签: ruby-on-rails devise mongoid devise-invitable

我正在使用Rails4和Mongoid中的单表继承设计

Class User
  #devise class
  validates :email, :uniqueness => { :scope => :_type }
end

class Patient < User
end

class Doctor < User
end

class Hospital < User
end

如果我创建一个帐户作为医生,类型将是_type: "Doctor",那么如果他想创建一个帐户作为患者或医院,那么首先检查数据库是否已存在任何帐户类型的电子邮件然后只使用该帐户电子邮件使用以前的凭据创建帐户。

所以我不想在注册创建其他帐户类型时提供所有数据。

如何实现这种情况!!!请帮帮我......

1 个答案:

答案 0 :(得分:0)

如果我是你,我不使用继承。我做这样的事情:

Class User
  field :name
  field :email
end

Class Patient
  has_one :user

  attr_accesor :email
  field: disease

  before_create do
    existing_user = User.where( email: email ).first

    if uxisting_user
      user = uxisting_user
    else
      # you need create first an user
    end
  end

  def name
    user.name
  end
end

现在如果用户已经存在,只需要用于搜索它的电子邮件字段,您就可以获得所有这些信息:

User.create( name: 'User1', email: 'user1@email.com' )
Patient.create( email: 'user1@email.com', disease: 'headache' )
Patient.first.name
=> "User1"

此外,如果您更改了用户信息,则会在患者中更改,其他类别也会更改。