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.
75 lines
2.3 KiB
75 lines
2.3 KiB
# frozen_string_literal: true
|
|
|
|
# SurveyItemResponse.where(student: StudentRace.where(race: Race.find_by_qualtrics_code(8)).limit(10).map(&:student)).count
|
|
require 'csv'
|
|
|
|
class StudentLoader
|
|
def self.load_data(filepath:)
|
|
File.open(filepath) do |file|
|
|
headers = file.first
|
|
|
|
students = []
|
|
file.lazy.each_slice(1000) do |lines|
|
|
CSV.parse(lines.join, headers:).map do |row|
|
|
# students << process_row(row:)
|
|
process_row(row:)
|
|
end
|
|
end
|
|
# Student.import students.compact.flatten.to_set.to_a, batch_size: 1000,
|
|
# on_duplicate_key_update: { conflict_target: [:id] }
|
|
end
|
|
end
|
|
|
|
def self.process_row(row:)
|
|
race_codes = row['RACE'] || row['What is your race/ethnicity?(Please select all that apply) - Selected Choice'] || '99'
|
|
race_codes = race_codes.split(',').map(&:to_i) || []
|
|
races = process_races(codes: race_codes)
|
|
response_id = row['ResponseId'] || row['Responseid'] || row['ResponseID'] ||
|
|
row['Response ID'] || row['Response id'] || row['Response Id']
|
|
lasid = row['LASID'] || row['lasid']
|
|
return nil if student_exists?(response_id:)
|
|
|
|
student = create_student(response_id:, lasid:, races:)
|
|
|
|
assign_student_to_responses(response_id:, student:)
|
|
student
|
|
end
|
|
|
|
def self.student_exists?(response_id:)
|
|
Student.find_by_response_id(response_id).present?
|
|
end
|
|
|
|
def self.assign_student_to_responses(response_id:, student:)
|
|
survey_responses = SurveyItemResponse.where(response_id:)
|
|
survey_responses.each do |response|
|
|
response.student = student
|
|
response.save
|
|
end
|
|
|
|
# SurveyItemResponse.import survey_responses, on_duplicate_key_update: { conflict_target: [:id], columns: [:student] }
|
|
end
|
|
|
|
def self.create_student(response_id:, lasid:, races:)
|
|
student = Student.new(response_id:)
|
|
races.each do |race|
|
|
student.races << race
|
|
end
|
|
student.lasid = lasid
|
|
student.save
|
|
student
|
|
end
|
|
|
|
def self.process_races(codes:)
|
|
codes = codes.map do |code|
|
|
code = 99 if [6, 7].include?(code)
|
|
Race.find_by_qualtrics_code(code)
|
|
end
|
|
remove_unknown_race_if_other_races_present(races: codes.to_set)
|
|
end
|
|
|
|
def self.remove_unknown_race_if_other_races_present(races:)
|
|
races.delete(Race.find_by_qualtrics_code(99)) if races.length > 1
|
|
races
|
|
end
|
|
end
|