app/models/survey_report.rb
class SurveyReport
def initialize(user:, survey:)
@user = user
@survey = survey
end
def total_scores_over_time
responses.order(:occurred_at).map { |r| [r.occurred_at.to_date, r.total_score] }
end
def average_score_by_question
SurveyAnswer
.joins(:survey_response, :survey_question)
.where(survey_responses: { user_id: @user.id, survey_id: @survey.id })
.group("survey_questions.text")
.average(:score)
end
def latest_response
responses.order(occurred_at: :desc).first
end
def previous_response
responses.order(occurred_at: :desc).offset(1).first
end
def score_delta
return nil unless latest_response && previous_response
latest_response.total_score - previous_response.total_score
end
private
def responses
@responses ||= @user.survey_responses.where(survey: @survey)
end
end
app/models/survey_report.rb