Fix response rates for small schools by accounting for expected minimum counts of responses less than 10

mciea-main
rebuilt 3 years ago
parent 097edb1744
commit 6b2555c1f0

@ -28,11 +28,14 @@ class StudentResponseRateCalculator < ResponseRateCalculator
end end
def survey_items_with_sufficient_responses(grade:) def survey_items_with_sufficient_responses(grade:)
threshold = 10
quarter_of_grade = enrollment_by_grade[grade] / 4
threshold = threshold > quarter_of_grade ? quarter_of_grade : threshold
SurveyItem.joins('inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.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, "survey_item_responses.academic_year": academic_year, "survey_item_responses.grade": grade, "survey_item_responses.survey_item_id": subcategory.survey_items.student_survey_items) .where("survey_item_responses.school": school, "survey_item_responses.academic_year": academic_year, "survey_item_responses.grade": grade, "survey_item_responses.survey_item_id": subcategory.survey_items.student_survey_items)
.group('survey_items.id') .group('survey_items.id')
.having('count(*) >= 10') .having("count(*) >= #{threshold}")
.count .count
end end

@ -65,8 +65,9 @@ describe ResponseRateCalculator, type: :model do
context 'there are responses for another survey item but not enough to meet the minimum threshold' do context 'there are responses for another survey item but not enough to meet the minimum threshold' do
before do before do
create_list(:survey_item_response, 9, survey_item: insufficient_student_survey_item_1, academic_year:, less_than_a_quarter_of_respondents_for_first_grade = 4
school:, grade: 1) create_list(:survey_item_response, less_than_a_quarter_of_respondents_for_first_grade, survey_item: insufficient_student_survey_item_1, academic_year:,
school:, grade: 1)
end end
it 'returns an average of the response rates for all grades' do it 'returns an average of the response rates for all grades' do
expect(StudentResponseRateCalculator.new(subcategory:, school:, academic_year:).rate).to eq 50 expect(StudentResponseRateCalculator.new(subcategory:, school:, academic_year:).rate).to eq 50

Loading…
Cancel
Save