【发布时间】: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