PERF: Preload voters_count and has_voted (#28808)

These fields are often used when serializing topics which may contain
multiple polls. On average, serializing a poll took 2+N queries where N
is the number of options. This change reduces the number of queries to
3, one for each field (Poll#voters_count, PollOption#voters_count and
Poll#has_voted?).
This commit is contained in:
Bianca Nenciu
2024-09-10 18:41:08 +03:00
committed by GitHub
parent f2059bf15f
commit 9b0300a647
7 changed files with 118 additions and 11 deletions

View File

@ -182,12 +182,12 @@ after_initialize do
end
if post_with_polls.present?
Poll
.where(post_id: post_with_polls)
.each do |p|
polls[p.post_id] ||= []
polls[p.post_id] << p
end
all_polls = Poll.includes(:poll_options).where(post_id: post_with_polls)
Poll.preload!(all_polls, user_id: @user&.id)
all_polls.each do |p|
polls[p.post_id] ||= []
polls[p.post_id] << p
end
end
polls