ruby-on-rails-3 - rails 复杂的多对多查询

标签 ruby-on-rails-3 scope many-to-many

我有 3 个模型:用户、团队和成员(member) -

class Team < ActiveRecord::Base
  has_many :memberships
  has_many :members, :through => :memberships, :source => :user
end

class User < ActiveRecord::Base
  has_many :memberships, :dependent => :destroy
  has_many :teams, :through => :memberships

  def team_mates
    teams = Team.where(:members => id)
    team_mates = teams.members
  end
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :team

  validates :user_id, :presence => true
  validates :team_id, :presence => true
end

而且,我不太清楚如何在 User 模型中编写 team_mates 方法。它应该返回一个包含 current_user 的团队中的其他用户的数组。我的想法是我应该使用一个范围来限制团队只包括当前用户是成员的团队,但我无法弄清楚语法。对此的任何帮助将不胜感激。

谢谢!

最佳答案

使用成员资格表查找与您调用该方法的用户共享任何团队的用户。然后要过滤掉与当前用户共享 1 个以上团队的重复用户,请使用 distinct。

我还没有测试下面的代码,但希望它能让你走上正确的道路:

def team_mates
  m = Membership.scoped.table
  Users.join(m).where(m[:team_id].in(team_ids)).project('distinct users.*')
end

更新

看起来该答案中的某些 Arel 方法无法轻松映射回 ActiveRecord 区域。 (如果有人知道怎么做,我很想知道!)而且它还返回“当前用户”。试试这个:
def team_mates
  User.joins(:memberships).where('memberships.team_id' => team_ids).where(['users.id != ?', self.id]).select('distinct users.*')
end

关于ruby-on-rails-3 - rails 复杂的多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5590762/

相关文章:

ruby-on-rails-3 - 如何在 Heroku 上使用 hstore

Jsf:两页主从的 bean 范围是什么?

grails - GORM多对多映射,可与其他字段结合使用

java - 具有一组自身的 Hibernate 映射实体

Laravel 8.x,3 个模型和多对多关系

ruby-on-rails-3 - Rails 3 按孙子计数的订单记录

ruby-on-rails - Rails 3 在 Ruby 1.9.2 上初始化非常慢

ruby-on-rails - Rails i18n 字符串自动小写?

android - Google+ 登录按钮无法运行 Android Studio

JavaScript:命名空间与作用域