You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sqm-dashboards/app/models/survey_item.rb

75 lines
2.7 KiB

# frozen_string_literal: true
# SurveyItem.includes(%i[scale measure subcategory]).where("scale.measure.subcategory": subcategory).first.subcategory
# SurveyItem.survey_items_for_grade_and_subcategory(school, academic_year, 0, subcategory)
# SurveyItem.includes(:survey_item_responses)
# .includes(:subcategory)
# .where("survey_item_responses.grade": grade,
# "survey_item_responses.school": school,
# "survey_item_responses.academic_year": academic_year,
# survey_item_id: subcategory.survey_items.pluck(:survey_item_id
# )).count
class SurveyItem < ActiveRecord::Base
belongs_to :scale, counter_cache: true
has_one :measure, through: :scale
has_one :subcategory, through: :measure
has_many :survey_item_responses
def score(school:, academic_year:)
@score ||= Hash.new do |memo, (school, academic_year)|
memo[[school, academic_year]] =
survey_item_responses.exclude_boston.where(school:, academic_year:).average(:likert_score).to_f
end
@score[[school, academic_year]]
end
scope :student_survey_items, lambda {
where("survey_item_id LIKE 's-%'")
}
scope :teacher_survey_items, lambda {
where("survey_item_id LIKE 't-%'")
}
scope :short_form_items, lambda {
where(on_short_form: true)
}
scope :early_education_surveys, lambda {
where("survey_item_id LIKE '%-%-es%'")
}
scope :survey_items_for_grade, lambda { |school, academic_year, grade|
includes(:survey_item_responses)
.where("survey_item_responses.grade": grade,
"survey_item_responses.school": school,
"survey_item_responses.academic_year": academic_year).distinct
}
scope :survey_item_ids_for_grade, lambda { |school, academic_year, grade|
survey_items_for_grade(school, academic_year, grade).pluck(:survey_item_id)
}
scope :survey_items_for_grade_and_subcategory, lambda { |school, academic_year, grade, subcategory|
includes(:survey_item_responses)
.where(
survey_item_id: subcategory.survey_items.pluck(:survey_item_id),
"survey_item_responses.school": school,
"survey_item_responses.academic_year": academic_year,
"survey_item_responses.grade": grade
)
}
scope :survey_type_for_grade, lambda { |school, academic_year, grade|
survey_items_set_by_grade = survey_items_for_grade(school, academic_year, grade).to_set
if survey_items_set_by_grade.size > 0 && survey_items_set_by_grade.subset?(early_education_surveys.pluck(:survey_item_id).to_set)
return :early_education
end
:regular
}
# Do I need this?
def description
DataAvailability.new(survey_item_id, prompt, true)
end
end