From b2e866a895b76629d2f801803598b2814107ced9 Mon Sep 17 00:00:00 2001 From: Nelson Jovel Date: Sat, 23 Dec 2023 21:18:09 -0800 Subject: [PATCH] perf: reduce number of queries by requesting grouped_responses once instead of for each measure --- app/models/measure.rb | 13 +++---------- app/models/survey_item_response.rb | 10 +++++++++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/models/measure.rb b/app/models/measure.rb index fe8c991c..0715d6f4 100644 --- a/app/models/measure.rb +++ b/app/models/measure.rb @@ -163,21 +163,13 @@ class Measure < ActiveRecord::Base def collect_survey_item_average(survey_items:, school:, academic_year:) @collect_survey_item_average ||= Hash.new do |memo, (survey_items, school, academic_year)| averages = survey_items.map do |survey_item| - grouped_responses(school:, academic_year:)[survey_item.id] + SurveyItemResponse.grouped_responses(school:, academic_year:)[survey_item.id] end.remove_blanks memo[[survey_items, school, academic_year]] = averages.average || 0 end @collect_survey_item_average[[survey_items, school, academic_year]] end - def grouped_responses(school:, academic_year:) - @grouped_responses ||= Hash.new do |memo, (school, academic_year)| - memo[[school, academic_year]] = - SurveyItemResponse.where(school:, academic_year:).group(:survey_item_id).average(:likert_score) - end - @grouped_responses[[school, academic_year]] - end - def sufficient_student_data?(school:, academic_year:) return false unless includes_student_survey_items? @@ -227,7 +219,8 @@ class Measure < ActiveRecord::Base def admin_data_averages(school:, academic_year:) @admin_data_averages ||= Hash.new do |memo, (school, academic_year)| - memo[[school, academic_year]] = AdminDataValue.where(school:, academic_year:, admin_data_item: admin_data_items).pluck(:likert_score) + memo[[school, academic_year]] = + AdminDataValue.where(school:, academic_year:, admin_data_item: admin_data_items).pluck(:likert_score) end @admin_data_averages[[school, academic_year]] end diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb index 526ea329..11b396fe 100644 --- a/app/models/survey_item_response.rb +++ b/app/models/survey_item_response.rb @@ -16,7 +16,7 @@ class SurveyItemResponse < ActiveRecord::Base has_one :measure, through: :survey_item scope :exclude_boston, lambda { - includes(school: :district).where.not("district.name": "Boston") + includes(school: :district).where.not("district.name": "Boston") } scope :averages_for_grade, lambda { |survey_items, school, academic_year, grade| @@ -49,4 +49,12 @@ class SurveyItemResponse < ActiveRecord::Base school:, academic_year:, grade: school.grades(academic_year:) ).where("student_races.race_id": race.id).group(:survey_item_id).having("count(*) >= 10").average(:likert_score) } + + def self.grouped_responses(school:, academic_year:) + @grouped_responses ||= Hash.new do |memo, (school, academic_year)| + memo[[school, academic_year]] = + SurveyItemResponse.where(school:, academic_year:).group(:survey_item_id).average(:likert_score) + end + @grouped_responses[[school, academic_year]] + end end