我有一个带有用户的 Rails 应用程序,每个用户都有 HABTM 角色。
我想选择没有特定角色的用户。我可以使用搜索逻辑,但我迷路了。我尝试过使用条件、连接和包含的组合,但我似乎无法确定它。这有效:
User.find(:all, :conditions => ['role_id != ?', Role[:admin].id], :joins => :roles)
查找不是管理员的用户,但找不到没有角色的用户(我也想找到)。
在我疲惫的状态下,我错过了什么简单的事情?
我有一个带有用户的 Rails 应用程序,每个用户都有 HABTM 角色。
我想选择没有特定角色的用户。我可以使用搜索逻辑,但我迷路了。我尝试过使用条件、连接和包含的组合,但我似乎无法确定它。这有效:
User.find(:all, :conditions => ['role_id != ?', Role[:admin].id], :joins => :roles)
查找不是管理员的用户,但找不到没有角色的用户(我也想找到)。
在我疲惫的状态下,我错过了什么简单的事情?
使用子查询和 NOT IN 运算符
User.find(:all,:conditions => ["id NOT IN (select user_id from roles_users where role_id = ?)", Role[:admin].id)
我可以
User.all - User.find(:all, :conditions => ['role_id = ?', Role[:admin].id], :joins => :roles)
它在两个查询中完成了我想要的,这对于这个项目来说可能很好,但是如果我可以将它变成一个查询,那就太好了。
这个怎么样:
User.find :all, :conditions => [ 'roles.id is ? or roles.id != ?', nil, Role[:admin].id ], :include => :roles
这适用于has_many :through
,似乎它应该与 HABTM 相同。