我的模型User,Group和Membership具有以下结构:
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和Group的连接表。
鉴于用户user
,如何找到所有属于同一组中至少一个的兄弟用户?就是这样的事情
user.groups.users # assuming such a line were possible
我想在单个查询中完成并且仅在Active Record中执行此操作,但如果更快或更具可读性,我可以使用两个查询。 (如果有帮助的话,DB语言也是PSQL。)
答案 0 :(得分:1)
有一些方法可以将JOIN和子选择结合起来以获得一个数据库查询,请尝试以下方法:
summary(world)
# Bathymetric data of class 'bathy', with 1440 rows and 720 columns
# Latitudinal range: -89.88 to 89.88 (89.88 S to 89.88 N)
# Longitudinal range: -179.88 to 179.88 (179.88 W to 179.88 E)
# Cell size: 15 minute(s)
# Depth statistics:
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# -10635 -4286 -2455 -1892 214 6798
#
# First 5 columns and rows of the bathymetric matrix:
# -89.875 -89.625 -89.375 -89.125 -88.875
# -179.875 2746 2836 2893 2959 3016
# -179.625 2746 2835 2892 2958 3015
# -179.375 2746 2835 2891 2957 3014
# -179.125 2746 2834 2890 2956 3013
# -178.875 2746 2834 2889 2955 3012
P.S。不要忘记所有* _id列上的索引以获得快速查询 P.P.S.还有一种方法:2个子选择,1个DB查询。测试哪一个更符合您的要求:
antimeridian=TRUE
答案 1 :(得分:-1)
使用includes
:
groups = User.groups.includes(:users)
groups.each do |group|
puts "user = #{group.user}"
end