mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
PERF: Fix N+1 queries when loading groups.
This commit is contained in:
@@ -11,10 +11,7 @@ class BasicGroupSerializer < ApplicationSerializer
|
||||
:title,
|
||||
:grant_trust_level,
|
||||
:incoming_email,
|
||||
:notification_level,
|
||||
:has_messages,
|
||||
:is_member,
|
||||
:mentionable,
|
||||
:flair_url,
|
||||
:flair_bg_color,
|
||||
:flair_color
|
||||
@@ -22,30 +19,4 @@ class BasicGroupSerializer < ApplicationSerializer
|
||||
def include_incoming_email?
|
||||
scope.is_staff?
|
||||
end
|
||||
|
||||
def notification_level
|
||||
fetch_group_user&.notification_level
|
||||
end
|
||||
|
||||
def include_notification_level?
|
||||
scope.authenticated?
|
||||
end
|
||||
|
||||
def mentionable
|
||||
object.mentionable?(scope.user, object.id)
|
||||
end
|
||||
|
||||
def is_member
|
||||
scope.is_admin? || fetch_group_user.present?
|
||||
end
|
||||
|
||||
def include_is_member?
|
||||
scope.authenticated?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def fetch_group_user
|
||||
@group_user ||= object.group_users.find_by(user_id: scope.user.id)
|
||||
end
|
||||
end
|
||||
|
||||
3
app/serializers/basic_group_user_serializer.rb
Normal file
3
app/serializers/basic_group_user_serializer.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
class BasicGroupUserSerializer < ApplicationSerializer
|
||||
attributes :group_id, :user_id, :notification_level
|
||||
end
|
||||
11
app/serializers/group_serializer.rb
Normal file
11
app/serializers/group_serializer.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class GroupSerializer < BasicGroupSerializer
|
||||
attributes :mentionable
|
||||
|
||||
def mentionable
|
||||
object.mentionable?(scope.user, object.id)
|
||||
end
|
||||
|
||||
def include_mentionable?
|
||||
authenticated?
|
||||
end
|
||||
end
|
||||
11
app/serializers/group_show_serializer.rb
Normal file
11
app/serializers/group_show_serializer.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class GroupShowSerializer < BasicGroupSerializer
|
||||
attributes :is_group_user
|
||||
|
||||
def include_is_group_user?
|
||||
scope.authenticated?
|
||||
end
|
||||
|
||||
def is_group_user
|
||||
object.users.include?(scope.user)
|
||||
end
|
||||
end
|
||||
@@ -73,6 +73,7 @@ class UserSerializer < BasicUserSerializer
|
||||
|
||||
has_one :invited_by, embed: :object, serializer: BasicUserSerializer
|
||||
has_many :groups, embed: :object, serializer: BasicGroupSerializer
|
||||
has_many :group_users, embed: :object, serializer: BasicGroupUserSerializer
|
||||
has_many :featured_user_badges, embed: :ids, serializer: UserBadgeSerializer, root: :user_badges
|
||||
has_one :card_badge, embed: :object, serializer: BadgeSerializer
|
||||
has_one :user_option, embed: :object, serializer: UserOptionSerializer
|
||||
@@ -127,13 +128,19 @@ class UserSerializer < BasicUserSerializer
|
||||
end
|
||||
|
||||
def groups
|
||||
groups = object.groups.order(:id)
|
||||
|
||||
if scope.is_admin? || object.id == scope.user.try(:id)
|
||||
object.groups
|
||||
groups
|
||||
else
|
||||
object.groups.where(visible: true)
|
||||
groups.where(visible: true)
|
||||
end
|
||||
end
|
||||
|
||||
def group_users
|
||||
object.group_users.order(:group_id)
|
||||
end
|
||||
|
||||
def include_email?
|
||||
object.id && object.id == scope.user.try(:id)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user