在RoR中使用基于联接表的范围创建用户列表

时间:2016-01-31 21:29:46

标签: ruby-on-rails

我将用户角色从与用户关联的布尔值(例如user.teacher = true)移动到连接表样式,其中有两个模型:userrole,由一个连接加入表user_roles。我过去常常使用scope :admins, -> { where(admin: true) }来管理我的所有管理员,但这种情况不再适用(我的很多测试都失败了!)。当角色现在存储在另一个表中时,我如何获得管理员?

1 个答案:

答案 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