老实说,我不确定标题应该是什么问题,所以我想要实现的是,我有一个角色表,其中包含角色名称,可以分配给用户,如管理员,所有者,卖家,购买者
现在我要做的是在检查权限或分配角色时,我需要通过其名称获取角色的ID。假设我尝试将角色admin(带有id 1)添加到用户,该用户将在我的表user_roles中输入,然后它将是user_roles.create(user_id: some_users_id, role_id: 1)
,
现在而不是做role_id:1,我正在尝试做类似的事情 role_id :: admin。
网站中的所有内容都取决于角色和权限,因此我可以在某种会话或全球范围内保持相同。
我本可以在模型中保留角色并从中创建枚举,但是管理员可以添加新角色,从数据库中读取角色。
我使用Rails 5。
答案 0 :(得分:0)
据我所知,您需要一个变量来存储以下格式的数据。
{'admin' => 1, 'owner' => '2', 'seller' => '3', 'customer' => '4'}
可以实现的两种方式。1.Rails Cache,2。Redis。
在rails服务器启动期间,从角色表中为每个角色收集所有角色名称和 id 对,并将其存储到rails cache / redis中。在这两种情况下,密钥将角色名称,值将角色ID 。
每当用户添加新角色时,请确保在rails cache / redis store中更新相同内容。
并且类似地处理角色删除,这里你需要从rails cache / redis中删除密钥。
我建议使用Redis商店,它可用于跨多个rails服务器保留单个数据副本。
答案 1 :(得分:0)
如果您没有缓存服务器,只需在role_mapping.rb
文件夹中创建一个initializers
文件,
ROLES = Role.select([:id, :name]).as_json.map{ |h| h.values.reverse }.to_h
在你的控制器中,
user_roles.create(user_id: some_users_id, role_id: ROLES[params[:role]])
希望有所帮助......
创建新角色时,在Role
模型中
after_create :update_roles_mapping
def update_roles_mapping
Constant.const_set('ROLES', Role.select([:id, :name]).as_json.map{ |h| h.values.reverse }.to_h)
end
答案 2 :(得分:0)
用于执行用户角色的非常灵活且强大的模式是使用三个表:
class User << ApplicationRecord
has_many :user_roles
has_many :roles, through: :user_roles
def has_role?(name, resource = nil)
roles.where({ name: name, resource: resource }.compact).exists?
end
def add_role(name, resource = nil)
role = Role.find_or_create_by({ name: name, resource: resource }.compact)
user_roles.find_or_create_by(role: role)
end
end
# rails g model role name:string:index resource:belongs_to:polymorpic
class Role << ApplicationRecord
has_many :user_roles
has_many :users, through: :user_roles
belongs_to :resource, polymorphic: true, optional: true
end
# rails g model user_role user:belongs_to role:belongs_to
# add a unique compound index on user_id and role_id.
class UserRole << ApplicationRecord
belongs_to :user
belongs_to :role
validates_uniqueness_of :user_id, scope: :role_id
end
role
表存储角色的规范化定义。 user_roles
连接表存储应用的角色。
为什么?
如果您不想重新发明轮子,请尝试Rolify。