Как я могу перечислить всех пользователей, которые являются частью той же команды, что и текущий пользователь - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть сайт обмена сообщениями, где любой пользователь может отправлять сообщения друг другу, но теперь есть ли способ показать только пользователей, которые находятся в той же команде, что и текущий пользователь?

Моя модель user.rb:

class User < ApplicationRecord
  has_many :memberships
  has_many :teams, through: :memberships
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :validatable

end

Модель моей команды.rb:

class Team < ApplicationRecord
  has_many :memberships
  has_many :users, through: :memberships
  validates_uniqueness_of :name
end

Моя подписка.rb модель:

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :team
end

Мой вид "Контакты":

<li>
  <% @user = User.find(current_user.id) %>
  <% @all_teams = @user.teams %>

  <% @all_teams.users.each do |user| %>
    <%= user.name %> 
  <% end %>
</li>

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я бы оставил логику вне ваших представлений и вместо этого поместил бы ее в контроллер (или, как подсказывает @max, в модели User):

#current_user_controller.rb

class CurrentUserController < ApplicationController    
  def contacts
    @contacts = User.joins(:groups)
                    .where(groups: {id: current_user.groups})
                    .where.not(id: current_user).uniq
  end
end

Теперь вы можете перебирать @contacts в вашем current_user/contacts представлении.

0 голосов
/ 14 ноября 2018

Вы можете решить эту проблему, присоединившись к таблице членства и применив предложение where к таблице объединения:

class User < ApplicationRecord
  has_many :memberships
  has_many :groups, through: :memberships

  def users_with_same_groups
    User.joins(:memberships)
        .where(memberships: { group: self.groups })
        .where.not(id: self.id)
  end
end

SQL:

SELECT "users".*
FROM   "users"
       INNER JOIN "memberships"
               ON "memberships"."user_id" = "users"."id"
WHERE  "memberships"."group_id" IN (SELECT "groups"."id"
                                    FROM   "groups"
                                           INNER JOIN "memberships"
                                                   ON "groups"."id" =
                                                      "memberships"."group_id"
                                    WHERE  "memberships"."user_id" = $1)
LIMIT  $2 

Поскольку он производит внутреннее объединение, в него будут включены только записи с соответствием в объединенной таблице. Это означает, что набор результатов будет включать только пользователей, имеющих хотя бы одну общую группу.

.where.not(id: self.id) исключает self из результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...