我想在我的网站上声明不同的用户角色,我想知道在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
在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
如果我们考虑搜索速度,增加新角色和未来的维护,那么什么是更好的选择呢?
最佳答案 基本变体:
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关系.是的,稍后它可能会成为性能问题,因为为每个用户获取具有相关记录的所有角色可能非常困难.然后,您将研究其他变体以进行优化:位图,密集缓存或其他.
希望你觉得它有用.