我有一个消息传递站点,任何用户都可以互相发送消息,但是现在有一种方法可以只显示与当前用户处于同一团队的用户?
我的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>
答案 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
。