我将用户角色从与用户关联的布尔值(例如user.teacher = true
)移动到连接表样式,其中有两个模型:user
和role
,由一个连接加入表user_roles
。我过去常常使用scope :admins, -> { where(admin: true) }
来管理我的所有管理员,但这种情况不再适用(我的很多测试都失败了!)。当角色现在存储在另一个表中时,我如何获得管理员?
答案 0 :(得分:1)
您可以使用联接来限制具有特定角色的用户。我将假设您的Role
模型具有name
属性。联接看起来像这样:
User.joins(:roles).where(roles: { name: "Admin" })
如果您将来要添加更多角色,可以将其包含在范围内,也可以使用帮助器:
class User < ActiveRecord::Base
scope :with_role, -> (n) { joins(:roles).where(roles: { name: n })) }
scope :admins, -> { with_role("Admin") }
end
您还可以添加如下的实例方法:
def has_role?(role_name)
roles.find_by(name: role_name).present?
end