Rails访问DB数据作为变量

时间:2017-05-11 06:29:20

标签: ruby-on-rails

老实说,我不确定标题应该是什么问题,所以我想要实现的是,我有一个角色表,其中包含角色名称,可以分配给用户,如管理员,所有者,卖家,购买者

现在我要做的是在检查权限或分配角色时,我需要通过其名称获取角色的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。

3 个答案:

答案 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连接表存储应用的角色。

为什么?

  • 用户可以拥有无​​限数量/角色组合。
  • 使用规范化表格来避免重复。您没有为应用于用户的每个角色复制字符串“admin”。
  • 角色可以选择作用于资源。
  • 可以在不修改用户记录的情况下添加/撤消角色。
  • 如果需要,甚至可以在运行时创建角色。如在角色定义中可以通过GUI添加,例如在构建下一个Drupal的位置。

如果您不想重新发明轮子,请尝试Rolify