diff --git a/app/models/response_rate.rb b/app/models/response_rate.rb index 1fde6a7c..250f5e20 100644 --- a/app/models/response_rate.rb +++ b/app/models/response_rate.rb @@ -1,35 +1,5 @@ -module ResponseRate - TEACHER_RATE_THRESHOLD = 25 - STUDENT_RATE_THRESHOLD = 25 - - def initialize(subcategory:, school:, academic_year:) - @subcategory = subcategory - @school = school - @academic_year = academic_year - end - - def rate - return 100 if Respondent.where(school: @school, academic_year: @academic_year).count.zero? - - return 0 unless survey_item_count.positive? - - average_responses_per_survey_item = response_count / survey_item_count.to_f - - return 0 unless total_possible_responses.positive? - - response_rate = (average_responses_per_survey_item / total_possible_responses.to_f * 100).round - cap_at_100(response_rate) - end - - def meets_student_threshold? - rate >= STUDENT_RATE_THRESHOLD - end - - def meets_teacher_threshold? - rate >= TEACHER_RATE_THRESHOLD - end - - def cap_at_100(response_rate) - response_rate > 100 ? 100 : response_rate - end +class ResponseRate < ApplicationRecord + belongs_to :subcategory + belongs_to :school + belongs_to :academic_year end diff --git a/app/models/student_response_rate.rb b/app/models/student_response_rate.rb deleted file mode 100644 index cb5c1dc9..00000000 --- a/app/models/student_response_rate.rb +++ /dev/null @@ -1,58 +0,0 @@ -class StudentResponseRate - include ResponseRate - - private - - def survey_item_count - @survey_item_count ||= begin - survey = Survey.where(school: @school, academic_year: @academic_year).first - survey_items = SurveyItem.includes(%i[scale - measure]).student_survey_items.where("scale.measure": @subcategory.measures) - survey_items = survey_items.where(on_short_form: true) if survey.form == 'short' - survey_items = survey_items.reject do |survey_item| - survey_item.survey_item_responses.where(school: @school, academic_year: @academic_year).none? - end - survey_items.count - end - end - - def response_count - @response_count ||= @subcategory.measures.map do |measure| - measure.student_survey_items.map do |survey_item| - survey_item.survey_item_responses.where(school: @school, - academic_year: @academic_year).exclude_boston.count - end.sum - end.sum - end - - def total_possible_responses - @total_possible_responses ||= begin - total_responses = Respondent.where(school: @school, academic_year: @academic_year).first - return 0 unless total_responses.present? - - total_responses.total_students - end - end -end - -# survey = Survey.where(school:, academic_year:).first -# total_possible_student_responses = Respondent.where(school:, academic_year:).first - -# student_survey_items = Subcategory.all.map do |subcategory| -# subcategory.measures.map do |measure| -# measure.student_scales.map do |scale| -# scale.survey_items.count -# end.sum -# end.sum -# end -# student_response_counts = Subcategory.all.map do |subcategory| -# subcategory.measures.map do |measure| -# measure.student_survey_items.map do |survey_item| -# survey_item.survey_item_responses.where(school:, academic_year:).exclude_boston.count -# end.sum -# end.sum -# end - -# student_response_counts.each_with_index.map do |value, index| -# value.to_f / student_survey_items[index] / total_possible_student_responses * 100 -# end diff --git a/app/models/subcategory.rb b/app/models/subcategory.rb index 0fcb44d0..390482d5 100644 --- a/app/models/subcategory.rb +++ b/app/models/subcategory.rb @@ -13,7 +13,7 @@ class Subcategory < ActiveRecord::Base def student_response_rate(school:, academic_year:) @student_response_rate ||= Hash.new do |memo, (school, academic_year)| - memo[[school, academic_year]] = StudentResponseRate.new(subcategory: self, school:, academic_year:) + memo[[school, academic_year]] = StudentResponseRateCalculator.new(subcategory: self, school:, academic_year:) end @student_response_rate[[school, academic_year]] @@ -21,7 +21,7 @@ class Subcategory < ActiveRecord::Base def teacher_response_rate(school:, academic_year:) @teacher_response_rate ||= Hash.new do |memo, (school, academic_year)| - memo[[school, academic_year]] = TeacherResponseRate.new(subcategory: self, school:, academic_year:) + memo[[school, academic_year]] = TeacherResponseRateCalculator.new(subcategory: self, school:, academic_year:) end @teacher_response_rate[[school, academic_year]] diff --git a/app/models/teacher_response_rate.rb b/app/models/teacher_response_rate.rb deleted file mode 100644 index 87c80d64..00000000 --- a/app/models/teacher_response_rate.rb +++ /dev/null @@ -1,29 +0,0 @@ -class TeacherResponseRate - include ResponseRate - - def survey_item_count - @survey_item_count ||= @subcategory.measures.map do |measure| - measure.teacher_survey_items.reject do |survey_item| - survey_item.survey_item_responses.where(school: @school, academic_year: @academic_year).none? - end.count - end.sum - end - - def response_count - @response_count ||= @subcategory.measures.map do |measure| - measure.teacher_survey_items.map do |survey_item| - survey_item.survey_item_responses.where(school: @school, - academic_year: @academic_year).exclude_boston.count - end.sum - end.sum - end - - def total_possible_responses - @total_possible_responses ||= begin - total_responses = Respondent.where(school: @school, academic_year: @academic_year).first - return 0 unless total_responses.present? - - total_responses.total_teachers - end - end -end diff --git a/app/views/analyze/index.html.erb b/app/views/analyze/index.html.erb index 2cd9ceea..67e345c2 100644 --- a/app/views/analyze/index.html.erb +++ b/app/views/analyze/index.html.erb @@ -42,7 +42,7 @@ <% if empty_dataset?(measures: @measures, school: @school, academic_year: year) %> + data-bs-content="Teacher and student survey response rates below <%= ResponseRateCalculator::TEACHER_RATE_THRESHOLD %>%" > <% end %>