From b37d2f09ba32be27f50e6a0687ef7904c37e1120 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 14 Feb 2020 14:47:16 +0000 Subject: [PATCH] PERF: Memoize allowed user fields more efficiently (#8968) Previously we were caching by user_id, but the there are only two possible outcomes. Therefore we only need to cache two values. This removes another N+1 query when serializing multiple user cards. --- lib/guardian/user_guardian.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/guardian/user_guardian.rb b/lib/guardian/user_guardian.rb index 776d536ef10..35dccb8481f 100644 --- a/lib/guardian/user_guardian.rb +++ b/lib/guardian/user_guardian.rb @@ -114,9 +114,13 @@ module UserGuardian def allowed_user_field_ids(user) @allowed_user_field_ids ||= {} - @allowed_user_field_ids[user.id] ||= + + is_staff_or_is_me = is_staff? || is_me?(user) + cache_key = is_staff_or_is_me ? :staff_or_me : :other + + @allowed_user_field_ids[cache_key] ||= begin - if is_staff? || is_me?(user) + if is_staff_or_is_me UserField.pluck(:id) else UserField.where("show_on_profile OR show_on_user_card").pluck(:id)