【问题标题】:Retrieve users having all of the groups from an array of groups with Rails使用 Rails 从一组组中检索拥有所有组的用户
【发布时间】:2014-08-20 20:23:23
【问题描述】:

我有一个应用程序,其中用户有很多组,组有很多用户,通过 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))
}

这不是很漂亮,但它正在工作。

【问题讨论】:

  • 自己写sql很简单。此外,您不想在循环中运行单个查询。查询应包含“group_id in (list of id's)”
  • @DanBracuk 我希望用户恰好在 groups 数组的所有组中,而不是至少在一个组中的用户。
  • 我的意思是,IN (a,b) 类似于 (IN a) OR (IN b),但我想要的是类似于 (IN a) AND (IN b) 的东西。

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


【解决方案1】:

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

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

希望对您有所帮助。 :)

干杯!

【讨论】:

  • 感谢您的帮助,您对模型的看法完全正确,但这不是我想要的。如果groups = (A,B,C),用你的答案我会检索(A和B)或(A)中的用户,因为我只想要(A和B和C)中的用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多