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