fix: Filter out responses that don't correspond to the grades the school serves

pull/2/head
rebuilt 2 years ago
parent 0bacac6962
commit f035c4d9ad

@ -25,14 +25,14 @@ class Measure < ActiveRecord::Base
end end
def student_survey_items_with_sufficient_responses(school:, academic_year:) def student_survey_items_with_sufficient_responses(school:, academic_year:)
@student_survey_items_with_sufficient_responses ||= @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")
SurveyItem.where(id: SurveyItem.joins('inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.id')
.student_survey_items .student_survey_items
.where("survey_item_responses.school": school, .where("survey_item_responses.school": school,
"survey_item_responses.academic_year": academic_year, "survey_item_responses.academic_year": academic_year,
"survey_item_responses.survey_item_id": survey_items.student_survey_items) "survey_item_responses.survey_item_id": survey_items.student_survey_items,
.group('survey_items.id') "survey_item_responses.grade": school.grades(academic_year:))
.having('count(*) >= 10') .group("survey_items.id")
.having("count(*) >= 10")
.count.keys) .count.keys)
end end

@ -19,4 +19,8 @@ class School < ApplicationRecord
.where(districts: { qualtrics_code: district_code }) .where(districts: { qualtrics_code: district_code })
.find_by_qualtrics_code(school_code) .find_by_qualtrics_code(school_code)
end end
def grades(academic_year:)
Respondent.find_by(school: self, academic_year:)&.counts_by_grade&.keys || (-1..12).to_a
end
end end

@ -24,11 +24,11 @@ class SurveyItemResponse < ActiveRecord::Base
scope :averages_for_gender, lambda { |survey_items, school, academic_year, gender| scope :averages_for_gender, lambda { |survey_items, school, academic_year, gender|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, gender:).group(:survey_item).average(:likert_score) 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| scope :averages_for_income, lambda { |survey_items, school, academic_year, income|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, income:).group(:survey_item).average(:likert_score) academic_year:, income:, grade: school.grades(academic_year:)).group(:survey_item).average(:likert_score)
} }
end end

@ -61,7 +61,7 @@ class RaceScoreLoader
@grouped_responses ||= Hash.new do |memo, (school, academic_year, survey_items, race)| @grouped_responses ||= Hash.new do |memo, (school, academic_year, survey_items, race)|
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( 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) ).where("student_races.race_id": race.id).group(:survey_item_id).having("count(*) >= 10").average(:likert_score)
end end

Loading…
Cancel
Save