声明不同用户角色的最佳做法?

时间:2014-02-13 19:02:05

标签: ruby-on-rails ruby activerecord

我想在我的网站上声明不同的用户角色,我想知道在Rails中执行此操作的最佳做​​法是什么?现在我有两个选择:

选项1:

我创建表Users并声明一个字符串列,我可以存储用户角色的名称(SuperAdmin,Admin,Coach,Player)

create_table "users", force: true do |t|
    t.string   "username"
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "role"
end

Inside User类我保存这样的值:

class User < ActiveRecord::Base
  ROLES = %w[SuperAdmin, Admin, Player, Coach]
end

选项2:

我只为角色创建一个单独的表。 Inside Users表我有整数列来存储role_id:

create_table "users", force: true do |t|
    t.string   "username"
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.integer  "role_id"
end

create_table "roles", force: true do |t|
    t.string   "role_name"
end

class User < ActiveRecord::Base
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :users
end

如果我们考虑搜索速度,增加新角色和未来的维护,会有什么更好的选择呢?

3 个答案:

答案 0 :(得分:2)

基本变体:

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class CreateRolesUsersJoinTable < ActiveRecord::Migration
  def change
    create_table :roles_users, id: false do |t|
     t.integer :user_id
     t.integer :role_id
    end
  end
end

原因如下:您不希望has_many拥有角色,因为您将无法将同一角色与不同用户相关联。这是典型的HABTM关系。是的,稍后它可能会成为性能问题,因为为每个用户获取具有相关记录的所有角色可能非常困难。然后,您将研究其他变体以进行优化:位图,密集缓存或其他。

希望你觉得它很有用。

答案 1 :(得分:0)

创建另一个表来存储角色是一个过度设计的解决方案:)

使用gem cancan 是一种很好的方法,您只需要向用户模型添加一个字段即可。 使用cancan,您甚至可以为用户分配多个角色,并使用位掩码将其存储到单个整数列中。

答案 2 :(得分:0)

IMO最好的方法是在has_manybelongs_to型号之间使用标准的User Role关系:

#app/models/user.rb
Class User < ActiveRecord::Base
   belongs_to :role

   before_create :set_role

   def set_role
       role = self.role_id
       role_id = "0" unless defined?(role)
   end 
end

#app/models/role.rb
Class Role < ActiveRecord::Base
   has_many :users
end

users
id | role_id | name | created_at | updated_at

roles 
id | name | created_at | updated_at

这将允许您将用户与特定角色相关联,并继续根据需要添加/调整角色