我如何为Rails实现多类型用户系统?

时间:2014-11-13 04:04:14

标签: ruby-on-rails types rails-activerecord

我正在创建一个Rails应用程序,用户可以通过选中表单中的“人”或“组织”来注册。我正在努力找到一种方法将其实现到Rails中。这两种用户类型都具有相同的授权。我不知道我是否想在我的ActiveRecord数据库中使用字符串或布尔值作为数据类型。另外,我需要在我的模型(User.rb)和我的控制器中放置什么才能验证它并分别实现它?

3 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一点;这取决于你的需求。问问自己:“人和组织是否共享相同的属性?

AR Enum

如果他们这样做,唯一能区分两者的是角色(或任何你想称之为的角色),即个人或组织。对于那种情况,Rails 4.1 provides AR enums。这是最简单的解决方案,它可能是这样的:

class User < ActiveRecord::Base
  enum role: [ :person, :organization ] # @user.role => 'person', @user.person? => true
end

多态协会

另一方面,如果人员和组织只共享某些属性,您可以考虑使用polymorphic association(如果人员和组织不共享任何属性 - 甚至不是role - 他们应该是两个不同的模型)。基本模型应包含人员和组织共享的属性。人员/组织模型应包含特定于该模型的属性。

# common attributes
class User < ActiveRecord::Base
  belongs_to :profile, polymorphic: true

  def self.roles
    %w(person organization)
  end
end

# person-specific attributes
class PersonProfile < ActiveRecord::Base
  has_one :user, as: :profile, dependent: :destroy
end

# organization-specific attributes
class OrganizationProfile < ActiveRecord::Base
  has_one :user, as: :profile, dependent: :destroy
end

对于用户注册,您可以创建users#newusers#create操作。在您的用户注册表单(可能是app/views/users/new.html.erb)中,您可以使用select_tag让用户指定其角色。然后,使用它来确定要附加到用户模型的配置文件类型。例如(users#create):

def create
  @user = User.new(user_params)
  if role = params[:role]
    # return HTTP 400
    head :bad_request and return unless User.roles.include?(role)

    # Assign the User's profile
    @user.profile = "#{role.capitalize}Profile".constantize.new
  else
    # enter your own logic here
  end

  @user.save ? redirect_to(@user) : render(:new)
end

我认为会话的处理(用户登录/注销)应该在单独的SessionsController处理。

答案 1 :(得分:0)

将新表添加到名为user_types的数据库中,其中包含字段roleid。在users表格中,您需要添加user_type_id列。然后,在UserType模型中

class UserType < ActiveRecord::Base
  has_many :users
end

User模型中,您需要添加

class User < ActiveRecord::Base
  belongs_to :user_type
end

您可以在种子中创建UserType记录,但要确保每次重置数据库时都会运行,将其添加到seeds.rb

UserType.create!(role: "person")
UserType.create!(role: "organization")

希望这是有道理的!

答案 2 :(得分:0)

如果您的问题中只有两种类型的用户(人员和组织),您可以拥有一个Person模型,并为其添加一个bool字段is_organization。有关更多详细信息,请参阅设计(一种流行的身份验证gem)如何处理此here(此方法是链接页面上的选项2,您还可以查看选项1,即创建一个完整的新模型)。 / p>