Rails 4 - 通过连接表条件查找对象

时间:2014-09-13 21:55:12

标签: sql ruby-on-rails ruby postgresql activerecord

我有两个模型,UserTeam,它是一个many-to-many,其中有一个名为Member的连接表。它设置如下:

#Team:
has_many :members, dependent: :destroy
has_many :users, through: :members 

#User
has_many :members
has_many :teams, through: :members

#Member
belongs_to :user
belongs_to :team

我希望用户能够访问彼此的个人资料页面(controller: :users, action: :show)。在个人资料页面上,我只想列出两个用户都是其成员的团队(他们也可以是不同团队的成员)。

我的意思是:

#UsersController
def show 
  @user = User.find(params[:id])
  @teams = @user.teams.joins(:members).where(:members => { :user_id => current_user.id })
end

这不起作用(在某些情况下不显示任何团队,其他人显示错误的团队,总失败!)

那么,做我想要的正确方法是什么?只列出两个用户都是其成员的团队?

1 个答案:

答案 0 :(得分:2)

只需交叉即可找到您想要的team_ids:

@teams = Team.find(@user.members.pluck(:team_id) & current_user.members.pluck(:team_id))

注意:如果您已加载成员集合,则可以使用collect(&:team_id)而不是pluck(:id)来保存对数据库的额外调用。