Используйте таблицу членства, чтобы найти пользователей, которые разделяют любую команду с пользователем, для которого вы вызываете метод.Затем, чтобы отфильтровать дублирующих пользователей, которые совместно используют более 1 команды с текущим пользователем, используйте отличные.
Я не тестировал приведенный ниже код, но, надеюсь, он выведет вас на правильный путь:
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