Skip to content

Commit 4c1cb8c

Browse files
committed
Optimize topics#show queries
This corrected AR usage / eager loading so we execute less actual sql queries, speeding up the rendering time
1 parent 008779d commit 4c1cb8c

3 files changed

Lines changed: 23 additions & 22 deletions

File tree

app/controllers/topics_controller.rb

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,28 @@ def new_topics_count
3636
end
3737

3838
def show
39-
messages_scope = @topic.messages.includes(
40-
:attachments,
41-
:sender,
42-
:sender_person,
43-
{ sender_person: :default_alias },
44-
{
45-
reply_to: [
46-
:sender,
47-
:sender_person,
48-
{ sender_person: :default_alias }
49-
]
50-
}
51-
)
39+
messages_scope = @topic.messages
40+
.eager_load(
41+
:sender,
42+
:sender_person,
43+
{ sender_person: :default_alias },
44+
{
45+
reply_to: [
46+
:sender,
47+
:sender_person,
48+
{ sender_person: :default_alias }
49+
]
50+
}
51+
)
52+
.preload(:attachments)
5253

5354
@messages = messages_scope.order(created_at: :asc)
5455
@message_numbers = @messages.each_with_index.to_h { |msg, idx| [msg.id, idx + 1] }
5556
preload_read_state!
5657
auto_mark_aware!
5758

5859
build_participants_sidebar_data(messages_scope)
59-
build_thread_outline(messages_scope)
60+
build_thread_outline(@messages)
6061
load_commitfest_sidebar
6162
if user_signed_in?
6263
load_notes
@@ -324,17 +325,17 @@ def build_participants_sidebar_data(_messages_scope)
324325

325326
{
326327
alias: alias_record,
328+
person: tp.person,
327329
message_count: tp.message_count,
328330
first_at: tp.first_message_at,
329331
last_at: tp.last_message_at
330332
}
331333
end.compact
332334
end
333335

334-
def build_thread_outline(messages_scope)
335-
ordered_messages = messages_scope.order(:created_at)
336+
def build_thread_outline(messages)
336337
children = Hash.new { |h, k| h[k] = [] }
337-
ordered_messages.each do |msg|
338+
messages.each do |msg|
338339
children[msg.reply_to_id] << msg
339340
end
340341

app/views/topics/_message.html.slim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
- profile_path = message.sender_person ? person_path(display_alias.email) : nil
2727
- if profile_path
2828
= link_to profile_path, class: "author-avatar-link" do
29-
= image_tag display_alias.display_gravatar_url(size: 42), class: "message-avatar", alt: display_alias.name
29+
= image_tag display_alias.gravatar_url(size: 42), class: "message-avatar", alt: display_alias.name
3030
- else
31-
= image_tag display_alias.display_gravatar_url(size: 42), class: "message-avatar", alt: display_alias.name
31+
= image_tag display_alias.gravatar_url(size: 42), class: "message-avatar", alt: display_alias.name
3232
.author-details
3333
- if profile_path
3434
.author-name = link_to display_alias.name, profile_path, class: "author-name-link"

app/views/topics/show.html.slim

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
.outline-avatars
125125
- participants.each do |participant|
126126
= link_to person_path(participant.email), class: "outline-avatar-link" do
127-
= image_tag participant.display_gravatar_url(size: 24), class: "outline-avatar", alt: participant.name, title: participant.name
127+
= image_tag participant.gravatar_url(size: 24), class: "outline-avatar", alt: participant.name, title: participant.name
128128
- if is_reply
129129
span.outline-icon
130130
span.branch-toggle = ""
@@ -142,7 +142,7 @@
142142
.outline-content
143143
.outline-meta
144144
span.outline-number = "##{entry[:message_number]}"
145-
= image_tag msg_display.display_gravatar_url(size: 32), class: "outline-avatar", alt: msg_display.name
145+
= image_tag msg_display.gravatar_url(size: 32), class: "outline-avatar", alt: msg_display.name
146146
- if is_reply
147147
span.outline-icon
148148
span.outline-author = msg_display.name
@@ -161,7 +161,7 @@
161161
.outline-content
162162
.outline-meta
163163
span.outline-number = "##{entry[:message_number]}"
164-
= image_tag msg_display.display_gravatar_url(size: 32), class: "outline-avatar", alt: msg_display.name
164+
= image_tag msg_display.gravatar_url(size: 32), class: "outline-avatar", alt: msg_display.name
165165
- if is_reply
166166
span.outline-icon
167167
span.outline-author = msg_display.name

0 commit comments

Comments
 (0)