从具有Rails的组数组中检索具有所有组的用户

时间:2014-06-30 12:50:02

标签: mysql sql ruby-on-rails join scope

我有一个应用,通过GroupUsers连接表,用户有许多组,组有很多用户。

我想让所有用户都在完全全部的给定数组的组中。

这听起来很简单,但我还没有设法找到办法。

这是我尝试过的(all_groups是组数组):

users = User
all_groups.each do |group| 
  users = users.joins(:group_users).where("group_users.group_id = ?", group.id)
end   

我总是没有结果,所以我试着去了解发生了什么:

users = User

group1 = all_groups.first 
group2 = all_groups.last 

users1 = users.joins(:group_users).where("group_users.group_id = ?", group1.id)
users2 = users1.joins(:group_users).where("group_users.group_id = ?", group2.id)  

users1是一个数组,其group1中的所有用户都符合预期,但users2始终为空。

有人知道如何解决这个问题吗?

编辑:答案:

users = User
all_groups.each do |group| 
  users = User.including_ids(users.map(&:id)).joins(:group_users).where("group_users.group_id = ?", group.id)
end  

使用models / user.rb:

scope :including_ids, ->(*ids) {
  where(arel_table[:id].in(ids))
}

这不是很漂亮,但它正在发挥作用。

1 个答案:

答案 0 :(得分:0)

根据你给出的解释,我假设你有类似的东西:

class User
  has_many :group_users
  has_many :groups, through: :group_users
end

class GroupUser
  belongs_to :user
  belongs_to :group
end

class Group
  has_many :group_users
  has_many :users, through: :group_users
end

如果是,您可以执行以下操作:

# get groups
groups = Group.where( ......some condition here ) 

# as long as groups is an ActiveRecord::Relation type you can use 'pluck'
User.joins( :group_users ).where( 'group_users.group_id IN (?)', groups.pluck(:id) ).uniq

希望有所帮助。 :)

干杯!