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

时间:2019-12-11 10:37:35

标签: ruby-on-rails ruby-on-rails-4 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

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

3 个答案:

答案 0 :(得分:1)

这不是最佳答案,但如有必要,您可以使用它。

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

答案 1 :(得分:0)

所以

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))

这应该返回所需的集合,现在我们可以对其进行一些改进:

在您的User类中添加方法

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)

答案 2 :(得分:0)

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

像魅力一样工作...