如何从多对多关系中过滤字段,但避免缓存关系结果?

时间:2016-10-07 10:27:38

标签: ruby-on-rails ruby

假设我有以下型号:

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

但是如何以这种方式查找属于passengerdriver角色的所有用户?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下

Role.where("name = ? OR name = ?", 'passenger', 'driver').includes(:users)

Role.joins(:users).where("roles.name = 'passenger'")