Rename response rate to response rate calculator

pull/1/head
rebuilt 4 years ago
parent d15e89f37c
commit 0e9acc7467

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

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

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

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

@ -42,7 +42,7 @@
<% if empty_dataset?(measures: @measures, school: @school, academic_year: year) %>
<i class="fa-solid fa-circle-exclamation px-3"
data-bs-toggle="popover" data-bs-placement="right"
data-bs-content="Teacher and student survey response rates below <%= ResponseRate::TEACHER_RATE_THRESHOLD %>%" >
data-bs-content="Teacher and student survey response rates below <%= ResponseRateCalculator::TEACHER_RATE_THRESHOLD %>%" >
</i>
<% end %>
</div>

Loading…
Cancel
Save