2

複数の役割を持つユーザーを選択できるようにしたい:

User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

次の 2 つの役割のいずれかを持つユーザーを選択する方法を知っています。

User.joins(:roles).where(roles: { name: [:admin, :manager] })

しかし、少なくとも :admin と :manager の役割を持つすべてのユーザーを見つけるにはどうすればよいでしょうか?

4

4 に答える 4

1

これが実用的な解決策です:

User.select("DISTINCT users.*").
  joins("JOIN users_roles a ON a.user_id = users.id").
  joins("JOIN roles b ON b.id = a.role_id").
  joins("JOIN users_roles c ON c.user_id = users.id").
  joins("JOIN roles d ON d.id = c.role_id").
  where("b.name = ? and d.name = ? ", :admin, :manager)
于 2012-09-11T00:42:41.637 に答える
1

これはうまくいきます:

users = User.joins(:roles)
users.where("roles.name" => "admin") & users.where("roles.name" => "manager")

これにより、2 つの SQL ロード クエリが生成されることに注意してください。これは、このタイプの検索では避けられないと思います。(別の解決策でも 2 つの SQL クエリが作成されます。) また、アクティブ レコード リレーションではなく配列が返されることに注意してください。

于 2012-09-11T01:41:06.857 に答える
0

関連付けを として設定すると、has_many :throughユーザーごとに一意のロールをカウントできます。

class User < ActiveRecord::Base
  has_many :user_roles
  has_many :roles, :through => :user_roles
end

# Note: add an id column on the join table
class UserRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :user_roles
  has_many :users, :through => :user_roles
end


User.joins(:user_roles => :role).
  select("users.*, COUNT(DISTINCT user_roles.id) as user_role_count").
  where("roles.name IN ('Admin','Manager')").
  group("users.id").
  having("user_role_count = 2")
于 2012-09-11T02:51:56.593 に答える
0

これは機能しますが、間違っていると感じます:

Role.where(name: :admin).first.users.joins(:roles).where(roles: { name: :manager } )
于 2012-09-11T00:23:40.433 に答える