chore: load survey item responses. Show overview page without server errors

This commit is contained in:
Nelson Jovel 2024-01-26 07:43:29 -08:00
parent 589c0f7e11
commit a538eb72f2
9 changed files with 94 additions and 87 deletions

View file

@ -3,6 +3,7 @@
module Dashboard
class SurveyResponsesDataLoader
def load_data(filepath:)
byebug
File.open(filepath) do |file|
headers = file.first
headers_array = CSV.parse(headers).first
@ -13,8 +14,7 @@ module Dashboard
process_row(row: SurveyItemValues.new(row:, headers: headers_array, survey_items: all_survey_items,
schools:))
end
SurveyItemResponse.import survey_item_responses.compact.flatten, batch_size: 500,
on_duplicate_key_update: :all
SurveyItemResponse.upsert_all(survey_item_responses, unique_by: :response_id)
end
end
end
@ -25,25 +25,29 @@ module Dashboard
all_survey_items = survey_items(headers:)
survey_item_responses = []
row_count = 0
# row_count = 0
until file.eof?
line = file.gets
next unless line.present?
CSV.parse(line, headers:).map do |row|
survey_item_responses << process_row(row: SurveyItemValues.new(row:, headers: headers_array,
survey_items: all_survey_items, schools:))
values = process_row(row: SurveyItemValues.new(row:, headers: headers_array,
survey_items: all_survey_items, schools:))
survey_item_responses << values if values.present?
end
row_count += 1
next unless row_count == 500
# row_count += 1
# next unless row_count == 500
SurveyItemResponse.import survey_item_responses.compact.flatten, batch_size: 500, on_duplicate_key_update: :all
survey_item_responses = []
row_count = 0
# SurveyItemResponse.upsert_all(survey_item_responses, unique_by: :response_id)
# survey_item_responses = []
# row_count = 0
end
SurveyItemResponse.import survey_item_responses.compact.flatten, batch_size: 500, on_duplicate_key_update: :all
survey_item_responses = survey_item_responses.flatten.compact
SurveyItemResponse.upsert_all(survey_item_responses,
unique_by: %i[response_id dashboard_academic_year_id dashboard_school_id
dashboard_survey_item_id])
# SurveyItemResponse.upsert_all(survey_item_responses, update_only: [:likert_score])
end
private
@ -81,9 +85,9 @@ module Dashboard
def process_survey_items(row:)
student = Student.find_or_create_by(response_id: row.response_id, lasid: row.lasid)
student.races.delete_all
tmp_races = row.races.map { |race| races[race] }
student.races += tmp_races
# student.races.delete_all
# tmp_races = row.races.map { |race| races[race] }
# student.races += tmp_races
row.survey_items.map do |survey_item|
likert_score = row.likert_score(survey_item_id: survey_item.survey_item_id) || next
@ -93,31 +97,29 @@ module Dashboard
next
end
response = row.survey_item_response(survey_item:)
create_or_update_response(survey_item_response: response, likert_score:, row:, survey_item:, student:)
build_response(survey_item_response: response, likert_score:, row:, survey_item:, student:)
end.compact
end
def create_or_update_response(survey_item_response:, likert_score:, row:, survey_item:, student:)
def build_response(survey_item_response:, likert_score:, row:, survey_item:, student:)
gender = genders[row.gender]
grade = row.grade
income = incomes[row.income.parameterize]
ell = ells[row.ell]
sped = speds[row.sped]
recorded_date = row.recorded_date
if survey_item_response.present?
survey_item_response.likert_score = likert_score
survey_item_response.grade = grade
survey_item_response.gender = gender
survey_item_response.recorded_date = row.recorded_date
survey_item_response.income = income
survey_item_response.ell = ell
survey_item_response.sped = sped
survey_item_response.student = student
survey_item_response
else
SurveyItemResponse.new(response_id: row.response_id, academic_year: row.academic_year, school: row.school, survey_item:,
likert_score:, grade:, gender:, recorded_date: row.recorded_date, income:, ell:, sped:, student:)
end
{ response_id: row.response_id,
dashboard_academic_year_id: row.academic_year.id,
dashboard_school_id: row.school.id,
dashboard_survey_item_id: survey_item.id,
likert_score: likert_score.to_i,
grade:,
dashboard_gender_id: gender.id,
recorded_date:,
dashboard_income_id: income.id,
dashboard_ell_id: ell.id,
dashboard_sped_id: sped.id }
end
def survey_items(headers:)
@ -130,12 +132,4 @@ module Dashboard
.filter { |header| header.start_with? "t-", "s-" }
end
end
module StringMonkeyPatches
def valid_likert_score?
to_i.between? 1, 5
end
end
String.include StringMonkeyPatches
end