仅获取具有特定角色的用户 - Rolify

Get users which has specific role ONLY - Rolify

有一个下拉菜单显示定义如下的销售代表列表。

<%= f.select :sales_rep_id,
          User.with_role(:sales_rep).order(:email).map { |u| [u.email, u.id] },
          { include_blank: true },
          class: 'form-control' %>

sales_rep 用户可能还具有其他角色,例如开发人员。

我还需要隐藏具有开发人员角色的销售代表用户。

类似

User.where.not(has_role?(:developer)).with_role :sales_rep

关于如何实现这一点的任何想法。

这不是最佳答案,但您可以根据需要使用它。

User.with_role(:sales_rep) - User.with_role(:developer)

所以

developers = User.with_role(:developer)
sales_people = User.with_role(:sales_rep)

为了尽可能高效地将一组从另一组中排除,我会执行类似以下操作:

User.with_role(:sales_rep).where.not(id: User.with_role(:developer).select(:id).map(&:id))

这应该 return 想要的设置,现在我们可以稍微改进一下:

在你的Userclass中添加一个方法

def self.without_role(role)
  where.not(id: User.with_role(role).ids)
end

请注意,User.pluck(:id) 或简短版本 .ids 结果与 User.select(:id).amp(&:id) 相同,但效率更高,因为它不会实例化完整的 User 对象。

然后你可以写

User.without_role(:developer).with_role(:sales_rep)
non_developers = User.enabled.order(:email).without_role(:developer)
sales_reps = non_developers.with_role(:sales_rep)

工作起来很有魅力...