diff --git a/app/views/messages/boosts/_boosts.html.erb b/app/views/messages/boosts/_boosts.html.erb
index ca25d74..61636ea 100644
--- a/app/views/messages/boosts/_boosts.html.erb
+++ b/app/views/messages/boosts/_boosts.html.erb
@@ -2,7 +2,7 @@
- <%= render partial: "messages/boosts/boost", collection: message.boosts.ordered.includes(:booster) %>
+ <%= render partial: "messages/boosts/boost", collection: message.boosts.loaded? ? message.boosts.sort_by(&:created_at) : message.boosts.ordered.includes(:booster) %>
<%= turbo_frame_tag message, :new_boost do %>
diff --git a/test/controllers/messages_caching_test.rb b/test/controllers/messages_caching_test.rb
index 3a7c4c8..f071da0 100644
--- a/test/controllers/messages_caching_test.rb
+++ b/test/controllers/messages_caching_test.rb
@@ -53,6 +53,20 @@ class MessagesCachingTest < ActionDispatch::IntegrationTest
end
end
+ test "messages render their preloaded boosts in order without querying them again" do
+ earlier = messages(:fourth).boosts.create! booster: users(:jason), content: "🥇", created_at: 1.day.ago
+ in_order = [ dom_id(earlier), dom_id(boosts(:fourth_by_bender)) ]
+
+ assert_no_queries_match(/ORDER BY "boosts"/) do
+ get room_messages_url(rooms(:watercooler))
+ end
+ assert_response :success
+ assert_equal in_order, css_select("##{dom_id(messages(:fourth), :boosts)} .boost").map { it["id"] }
+
+ get message_boosts_url(messages(:fourth))
+ assert_equal in_order, css_select("##{dom_id(messages(:fourth), :boosts)} .boost").map { it["id"] }
+ end
+
private
def with_memory_cache
old_cache = Rails.cache