From 4648267b62c3ac64a39b1437b468af7de0bb3c08 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Sun, 4 Jan 2026 11:05:08 +0900 Subject: [PATCH 1/3] Cache root_id per Message maybe we'd better store this in messages table, but let's do in-memory for now... --- app/controllers/messages_controller.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 38e843a..e7686e8 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -39,20 +39,21 @@ def show(list_name:, list_seq:) private def calculate_navigation_links - # Find root of current thread - root = @message - while root.parent_id - root = Message.find(root.parent_id) + # Find root of current thread (cached) + root_id = Rails.cache.fetch("message:#{@message.id}:root_id") do + root = @message + root = Message.find(root.parent_id) while root.parent_id + root.id end # Find previous/next thread (root messages) - @prev_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id < ?', root.id).order(id: :desc).pick(:list_seq) - @next_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id > ?', root.id).order(:id).pick(:list_seq) + @prev_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id < ?', root_id).order(id: :desc).pick(:list_seq) + @next_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id > ?', root_id).order(:id).pick(:list_seq) # Get all messages in this thread thread_messages = Message.with_recursive( thread_msgs: [ - Message.where(id: root.id), + Message.where(id: root_id), Message.joins('inner join thread_msgs on messages.parent_id = thread_msgs.id') ] ).joins('inner join thread_msgs on thread_msgs.id = messages.id').order(:id).pluck(:id, :list_seq) From 60e134810dcba3cf3114c7cc2179be4c336926cd Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Sun, 4 Jan 2026 11:14:12 +0900 Subject: [PATCH 2/3] Cache thread query --- app/controllers/messages_controller.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index e7686e8..b55fec4 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -50,13 +50,15 @@ def calculate_navigation_links @prev_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id < ?', root_id).order(id: :desc).pick(:list_seq) @next_thread_seq = Message.where(list_id: @list, parent_id: nil).where('id > ?', root_id).order(:id).pick(:list_seq) - # Get all messages in this thread - thread_messages = Message.with_recursive( - thread_msgs: [ - Message.where(id: root_id), - Message.joins('inner join thread_msgs on messages.parent_id = thread_msgs.id') - ] - ).joins('inner join thread_msgs on thread_msgs.id = messages.id').order(:id).pluck(:id, :list_seq) + # Get all messages in this thread (cached) + thread_messages = Rails.cache.fetch("thread:#{root_id}:messages") do + Message.with_recursive( + thread_msgs: [ + Message.where(id: root_id), + Message.joins('inner join thread_msgs on messages.parent_id = thread_msgs.id') + ] + ).joins('inner join thread_msgs on thread_msgs.id = messages.id').order(:id).pluck(:id, :list_seq) + end # Find previous/next message in thread current_index = thread_messages.index {|(id, _)| id == @message.id } From 7151af8e7e399153f7e108dec89c8ee29bcb5857 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Sun, 4 Jan 2026 22:51:34 +0900 Subject: [PATCH 3/3] Cache YYYYMM list per mailing list --- app/controllers/messages_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index b55fec4..8b90eee 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -72,7 +72,10 @@ def render_threads(yyyymm: nil, q: nil) if q root_query.where!('body %> ?', q) else - @yyyymms = Message.distinct.where(list_id: @list, parent_id: nil).order('yyyymm').pluck('yyyymm') + # Cache YYYYMM list per mailing list + @yyyymms = Rails.cache.fetch("list:#{@list.id}:yyyymms") do + Message.distinct.where(list_id: @list, parent_id: nil).order('yyyymm').pluck('yyyymm') + end @yyyymm = yyyymm || @yyyymms.last root_query.where!(yyyymm: @yyyymm) end