如何列出与当前用户属于同一团队的所有用户

时间:2018-11-13 21:29:10

标签: ruby-on-rails ruby

我有一个消息传递站点,任何用户都可以互相发送消息,但是现在有一种方法可以只显示与当前用户处于同一团队的用户?

我的user.rb模型:

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

end

我的team.rb模型:

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

我的Membership.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 :(得分:1)

您可以通过联接成员资格表并将一个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

答案 1 :(得分:0)

我将逻辑保留在您的视图之外,而是将其放在控制器中(或者,如@max建议,在用户模型中):

#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