通过Rails中的联接表查找兄弟姐妹

时间:2017-11-21 04:06:07

标签: ruby-on-rails postgresql activerecord

我的模型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。)

2 个答案:

答案 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