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 に答える