Include badge before serializing (#16160)

We are loading the badge for each included tag in the
Search::TagSerializer and seeing warnings from bullet

```
Bullet::Notification::UnoptimizedQueryError:

GET /search/tags?name=ta
USE eager loading detected
  Tag => [:badge]
  Add to your query: .includes([:badge])

Call stack
  /home/travis/build/forem/forem/app/serializers/search/tag_serializer.rb:5:in `block in <class:TagSerializer>'
  /home/travis/build/forem/forem/app/services/search/tag.rb:11:in `serialize'
  /home/travis/build/forem/forem/app/services/search/tag.rb:7:in `search_documents'
  /home/travis/build/forem/forem/app/controllers/search_controller.rb:54:in `tags'
  /home/travis/build/forem/forem/app/lib/middlewares/set_time_zone.rb:10:in `call'
```

Follow the advice, now when multiple tags are in the result set,
having multiple badges, badges are loaded only once (at query time)
and not one by one (at serialization time).
This commit is contained in:
Daniel Uber 2022-01-17 17:12:52 -06:00 committed by GitHub
parent e1a88d6f81
commit f90459d163
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,7 +3,7 @@ module Search
ATTRIBUTES = %i[id name hotness_score rules_html supported short_summary bg_color_hex badge_id].freeze
def self.search_documents(term)
results = ::Tag.search_by_name(term).supported.reorder(hotness_score: :desc).select(*ATTRIBUTES)
results = ::Tag.search_by_name(term).supported.includes(:badge).reorder(hotness_score: :desc).select(*ATTRIBUTES)
serialize(results)
end