From 7373e2e52f11eb223c65cac37888fc6d17456c9c Mon Sep 17 00:00:00 2001 From: rebuilt Date: Fri, 4 Aug 2023 17:10:48 -0700 Subject: [PATCH] fix: Filter out responses that don't correspond to the grades the school serves --- app/models/measure.rb | 10 +++++----- app/models/school.rb | 4 ++++ app/models/survey_item_response.rb | 19 ++++++++++++------- app/services/race_score_loader.rb | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/models/measure.rb b/app/models/measure.rb index 04c06e07..8ab9200d 100644 --- a/app/models/measure.rb +++ b/app/models/measure.rb @@ -25,14 +25,14 @@ class Measure < ActiveRecord::Base end def student_survey_items_with_sufficient_responses(school:, academic_year:) - @student_survey_items_with_sufficient_responses ||= - SurveyItem.where(id: SurveyItem.joins('inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.id') + @student_survey_items_with_sufficient_responses ||= SurveyItem.where(id: SurveyItem.joins("inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.id") .student_survey_items .where("survey_item_responses.school": school, "survey_item_responses.academic_year": academic_year, - "survey_item_responses.survey_item_id": survey_items.student_survey_items) - .group('survey_items.id') - .having('count(*) >= 10') + "survey_item_responses.survey_item_id": survey_items.student_survey_items, + "survey_item_responses.grade": school.grades(academic_year:)) + .group("survey_items.id") + .having("count(*) >= 10") .count.keys) end diff --git a/app/models/school.rb b/app/models/school.rb index 53fd88a9..98367218 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -19,4 +19,8 @@ class School < ApplicationRecord .where(districts: { qualtrics_code: district_code }) .find_by_qualtrics_code(school_code) end + + def grades(academic_year:) + Respondent.find_by(school: self, academic_year:)&.counts_by_grade&.keys || (-1..12).to_a + end end diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb index bec60451..cf3986bc 100644 --- a/app/models/survey_item_response.rb +++ b/app/models/survey_item_response.rb @@ -13,17 +13,22 @@ class SurveyItemResponse < ActiveRecord::Base has_one :measure, through: :survey_item scope :exclude_boston, lambda { - boston = District.find_by_name('Boston') + boston = District.find_by_name("Boston") where.not(school: boston.schools) if boston.present? } - scope :averages_for_grade, ->(survey_items, school, academic_year, grade) { - SurveyItemResponse.where(survey_item: survey_items, school:, - academic_year: , grade:).group(:survey_item).average(:likert_score) + scope :averages_for_grade, lambda { |survey_items, school, academic_year, grade| + SurveyItemResponse.where(survey_item: survey_items, school:, + academic_year:, grade:).group(:survey_item).average(:likert_score) } - scope :averages_for_gender, ->(survey_items, school, academic_year, gender) { - SurveyItemResponse.where(survey_item: survey_items, school:, - academic_year: , gender:).group(:survey_item).average(:likert_score) + scope :averages_for_gender, lambda { |survey_items, school, academic_year, gender| + SurveyItemResponse.where(survey_item: survey_items, school:, + academic_year:, gender:, grade: school.grades(academic_year:)).group(:survey_item).average(:likert_score) + } + + scope :averages_for_income, lambda { |survey_items, school, academic_year, income| + SurveyItemResponse.where(survey_item: survey_items, school:, + academic_year:, income:, grade: school.grades(academic_year:)).group(:survey_item).average(:likert_score) } end diff --git a/app/services/race_score_loader.rb b/app/services/race_score_loader.rb index 99977608..7f23b382 100644 --- a/app/services/race_score_loader.rb +++ b/app/services/race_score_loader.rb @@ -61,7 +61,7 @@ class RaceScoreLoader @grouped_responses ||= Hash.new do |memo, (school, academic_year, survey_items, race)| memo[[school, academic_year, survey_items, race]] = SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where( - school:, academic_year: + 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) end