From c5dbda362be720c31acd7a9a4bf4515fc4445760 Mon Sep 17 00:00:00 2001 From: rsmokeUM Date: Tue, 17 Mar 2026 16:31:28 -0400 Subject: [PATCH] Refactor contest descriptions retrieval and helper methods for improved performance and clarity - Updated the ContainersController to include contest instances in the retrieval of contest descriptions, optimizing data loading and reducing N+1 query issues. - Enhanced the ContestDescriptionsHelper to simplify the logic for determining active contest instances and counting entries, improving code readability and maintainability. These changes enhance the efficiency of contest descriptions handling and improve the overall user experience. --- app/controllers/containers_controller.rb | 6 ++++-- app/helpers/contest_descriptions_helper.rb | 9 ++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/controllers/containers_controller.rb b/app/controllers/containers_controller.rb index 2c7178e3..ea540b1e 100644 --- a/app/controllers/containers_controller.rb +++ b/app/controllers/containers_controller.rb @@ -17,8 +17,10 @@ def show @container.assignments.container_managers ).includes(:user, :role) @assignment = @container.assignments.build - @container_contest_descriptions = @container.contest_descriptions.reorder('contest_descriptions.name ASC') - @active_contest_descriptions = @container.contest_descriptions.active.reorder('contest_descriptions.name ASC') + @container_contest_descriptions = @container.contest_descriptions + .includes(contest_instances: :entries) + .reorder('contest_descriptions.name ASC') + @active_contest_descriptions = @container_contest_descriptions.select(&:active?) end def new diff --git a/app/helpers/contest_descriptions_helper.rb b/app/helpers/contest_descriptions_helper.rb index bbf49b1c..562abce0 100644 --- a/app/helpers/contest_descriptions_helper.rb +++ b/app/helpers/contest_descriptions_helper.rb @@ -1,10 +1,9 @@ module ContestDescriptionsHelper def contest_description_entries_link(description) - active_instances = description.contest_instances.where(active: true) - return nil if active_instances.empty? + first_active = description.contest_instances.detect(&:active?) + return nil unless first_active - first_active = active_instances.first - entry_count = first_active.entries.where(deleted: false).count + entry_count = first_active.entries.reject(&:deleted).size link_to("Active: #{pluralize(entry_count, 'entry')}", container_contest_description_contest_instance_path(description.container, description, first_active), class: 'btn btn-sm btn-primary small') @@ -12,7 +11,7 @@ def contest_description_entries_link(description) def contest_description_summary(description) total_instances = description.contest_instances.count - active_instances = description.contest_instances.where(active: true) + active_instances = description.contest_instances.select(&:active?) summary = '' if active_instances.any? summary += contest_description_entries_link(description).to_s