仅获取具有特定角色的用户 - 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 想要的设置,现在我们可以稍微改进一下:
在你的User
class中添加一个方法
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)
工作起来很有魅力...
有一个下拉菜单显示定义如下的销售代表列表。
<%= 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 想要的设置,现在我们可以稍微改进一下:
在你的User
class中添加一个方法
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)
工作起来很有魅力...