假设我有以下型号:
class User < ActiveRecord::Base
as_many :role_users
as_many :roles, through: :role_users
end
class RoleUser < ActiveRecord::Base
belongs_to :role
belongs_to :user
end
class Role < ActiveRecord::Base
has_many :role_users
has_many :users, through: :role_users
end
我需要找到属于passenger
角色的所有用户。
> r1 = Role.create(:name ="passenger")
> r2 = Role.create(:name ="driver")
>
> u1 = User.create(:name ="Bob")
> u2 = User.create(:name ="Tom")
>
> u1.roles.push r1, r2
> u2.roles.push r1
>
> passengers = User.includes(:roles).where("roles.name": "passenger")
# To find all users who belongs to `passenger` or `driver` role
# passengers = User.includes(:roles).where("roles.name": %w(passenger, driver))
> passengers[0].roles.size # This is correct
=> 1
> passengers[1].roles.size # This is incorrect
=> 1
似乎从缓存结果中加载。
要重新加载缓存,它可以正常工作。
> passengers[1].roles(true).size # This is correct
=> 2
有更好的方法吗?
<小时/> 我发现了一种更好的方法:
> passengers = Role.where(:name => "passenger").take.users
> passengers[0].roles.size
=> 1
> passengers[1].roles.size
=> 2
但是如何以这种方式查找属于passenger
或driver
角色的所有用户?
答案 0 :(得分:0)
您可以尝试以下
Role.where("name = ? OR name = ?", 'passenger', 'driver').includes(:users)
或
Role.joins(:users).where("roles.name = 'passenger'")