PERF: Make TopicViewSerializer#requested_group_name more efficient. (#14196)

* Avoid executing a query when the custom field doesn't exist
* Avoid generating an ActiveRecord when all we need is the name.
This commit is contained in:
Alan Guo Xiang Tan 2021-08-31 12:05:32 +08:00 committed by GitHub
parent 7a604215e0
commit c2f87e0a36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 11 deletions

View File

@ -260,20 +260,17 @@ class TopicViewSerializer < ApplicationSerializer
end end
def requested_group_name def requested_group_name
if scope&.user Group
group = Group .joins(:group_users)
.joins('JOIN group_users ON groups.id = group_users.group_id') .where(
.find_by( id: object.topic.custom_fields['requested_group_id'].to_i,
id: object.topic.custom_fields['requested_group_id'].to_i, group_users: { user_id: scope.user.id, owner: true }
group_users: { user_id: scope.user.id, owner: true } )
) .pluck_first(:name)
group.name if group
end
end end
def include_requested_group_name? def include_requested_group_name?
object.personal_message object.personal_message && object.topic.custom_fields['requested_group_id']
end end
def include_published_page? def include_published_page?

View File

@ -484,4 +484,26 @@ describe TopicViewSerializer do
end end
end end
end end
describe '#requested_group_name' do
fab!(:pm) { Fabricate(:private_message_post).topic }
fab!(:group) { Fabricate(:group) }
it 'should return the right group name when PM is a group membership request' do
pm.custom_fields[:requested_group_id] = group.id
pm.save!
user = pm.first_post.user
group.add_owner(user)
json = serialize_topic(pm, user)
expect(json[:requested_group_name]).to eq(group.name)
end
it 'should not include the attribute for a non group membership request PM' do
json = serialize_topic(pm, pm.first_post.user)
expect(json[:requested_group_name]).to eq(nil)
end
end
end end