查询两个用户之间的公共组

Lui*_*gar 5 mysql ruby-on-rails rails-activerecord

我想查询两个用户之间的常见组.

这是我的模特:

用户模型

class User < ActiveRecord::Base
  has_many :group_memberships
  has_many :groups, through: :group_memberships
end
Run Code Online (Sandbox Code Playgroud)

集团模型

class Group < ActiveRecord::Base
  has_many :group_memberships
  has_many :users, through: :group_memberships
end
Run Code Online (Sandbox Code Playgroud)

在用户和组之间加入表模型

class GroupMembership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end
Run Code Online (Sandbox Code Playgroud)

可以说,我有两个用户A和B,我想得到用户A和用户B是共同成员的组.

例如:

用户A是组[W,X,Y]的成员

用户B是Groups [W,X,Z]的成员

使用此查询,预期答案将是组[W,X]

(Groups_From_A∩Group_From_B)

我已经找到了一些答案,但他们并没有只使用活动记录:

user_a.groups & user_b.groups
Run Code Online (Sandbox Code Playgroud)

我不想在内存中这样做,而是在数据库中.

Lui*_*gar 2

我做到了!!\o/

在 @zerkms 先生的帮助下,这里发布了答案。

好吧,我知道这很棘手,但结果比我想象的要容易。

最终查询:

Group.joins(:users).where(users: { id: [user_a.id, user_b.id] }).group("groups.id").having("COUNT(users.id)=2")
Run Code Online (Sandbox Code Playgroud)

解释:

我查询用户 A 和 B 的组:

Group.joins(:users).where(users: { id: [user_a.id, user_b.id] }).(...)
Run Code Online (Sandbox Code Playgroud)

它给了我一个包含两个用户的所有组的数组,甚至是重复的。

所以我将它们分组并得到计数为 2 的位置。因为当我们有一个组重复时,这意味着该组是从用户 A 和用户 B 查询的。

   (...).group("groups.id").having("COUNT(users.id)=2")
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但如果您有更好或不同的解决方案,我很高兴看到。

谢谢大家,谢谢 @zerkms 先生,我刚刚将您的答案“翻译”到了 RoR。