PERF: Fix N+1 queries when loading groups.

This commit is contained in:
Guo Xiang Tan
2016-11-25 15:26:49 +08:00
parent 712ff01f38
commit 5794f1619d
14 changed files with 73 additions and 44 deletions

View File

@@ -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

View File

@@ -0,0 +1,3 @@
class BasicGroupUserSerializer < ApplicationSerializer
attributes :group_id, :user_id, :notification_level
end

View 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

View 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

View File

@@ -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