我有具有以下结构的用户、组和成员模型:
class User < ApplicationRecord
has_many :memberships
has_many :groups, through: :memberships
end
class Group < ApplicationRecord
has_many :memberships
has_many :users, through: :memberships
end
class Membership < ApplicationRecord
belongs_to :user
belongs_to :group
end
基本上,Membership 是用户和组的连接表。
给定一个 User user
,我如何找到至少属于同一组的同级用户?也就是说,像
user.groups.users # assuming such a line were possible
我想在单个查询中并且仅在 Active Record 中执行此操作,但是如果两个查询更快或更易读,我也可以。(如果有帮助的话,DB 语言是 PSQL。)
有一些方法可以结合 JOIN 和子选择来获得一个数据库查询,试试这个:
User
.joins(:memberships)
.where.not(id: user.id)
.where(
memberships: {
group_id: user.memberships.select(:group_id)})
PS 不要忘记所有 *_id 列上的索引以获得快速查询。
PPS 另一种方式:2 个子选择,1 个 DB 查询。测试哪一个更适合您的要求:
user_groups_rel = user
.memberships
.select(:group_id)
groups_users_rel = Membership
.select(:user_id)
.where(group_id: user_groups_rel)
User
.where.not(id: user.id)
.where(id: groups_users_rel)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句