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

mciea-main
rebuilt 2 years ago
parent 4711e16c03
commit 7373e2e52f

@ -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

@ -13,17 +13,22 @@ class SurveyItemResponse < ActiveRecord::Base
has_one :measure, through: :survey_item has_one :measure, through: :survey_item
scope :exclude_boston, lambda { scope :exclude_boston, lambda {
boston = District.find_by_name('Boston') boston = District.find_by_name("Boston")
where.not(school: boston.schools) if boston.present? where.not(school: boston.schools) if boston.present?
} }
scope :averages_for_grade, ->(survey_items, school, academic_year, grade) { scope :averages_for_grade, lambda { |survey_items, school, academic_year, grade|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year: , grade:).group(:survey_item).average(:likert_score) academic_year:, grade:).group(:survey_item).average(:likert_score)
} }
scope :averages_for_gender, ->(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|
SurveyItemResponse.where(survey_item: survey_items, school:,
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