8

我有一个 user.rb 的模型,我在其中定义了一个范围admins,即通过权限表具有管理员角色的用户。

has_many :permissions
has_many :roles, :through => :permissions

作用域是这样的:

scope :admins, joins(:permissions).merge(Permission.admin_permissions)

我还想创建一个名为non-admins或类似的范围,即所有没有管理员角色的用户。

最简单的方法是什么?

4

2 回答 2

6

如果你想要一个反向 SQL 查询,你必须自己手动完成。没有内置的 ActiveRecord 解决方案。

scope :admins, joins(:permissions).merge(Permission.where("permissions.admin = true"))
scope :non_admins, joins(:permissions).merge(Permission.where("permissions.admin = false"))

如果作用域很多或者比较复杂,可以考虑通过 id 排除:

User.where("id not in (?)", User.admins.pluck(:id))

# or if you are already using admin records
admins = User.admins
User.where("id not in (?)", admins.map(&:id))

根据原始查询的行数和复杂性,这可能比以前的方式更慢或更快。

于 2013-05-22T12:49:53.837 回答
0

一种简单的方法,对很多用户来说性能不佳:

admin_user_ids  = User.admins.map(&:id)
non_admin_users = User.all.reject { |u| admin_user_ids.include?(u.id) }
于 2013-05-19T20:17:46.363 回答