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

我有两个模型, 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 

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

那么,做我想要的正确方法是什么? 仅列出两个用户所属的团队?

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

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

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