有一个下拉列表显示销售代表的列表,其定义如下。
<%= 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
关于如何实现这一目标的任何想法。
答案 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)
像魅力一样工作...