WIP: add multiple languages to parent

mciea-main
rebuilt 8 months ago
parent 446b3b1096
commit e90e6a4f0f

@ -1,4 +1,5 @@
class Parent < ApplicationRecord class Parent < ApplicationRecord
belongs_to :language, optional: true
belongs_to :housing, optional: true belongs_to :housing, optional: true
has_many :parent_languages
has_and_belongs_to_many :languages, join_table: :parent_languages
end end

@ -0,0 +1,4 @@
class ParentLanguage < ApplicationRecord
belongs_to :parent
belongs_to :language
end

@ -52,8 +52,12 @@ class SurveyItemResponse < ActiveRecord::Base
} }
scope :averages_for_language, lambda { |survey_items, school, academic_year, language| scope :averages_for_language, lambda { |survey_items, school, academic_year, language|
SurveyItemResponse.where(survey_item: survey_items, school:, # SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, language:, grade: school.grades(academic_year:)).group(:survey_item).having("count(*) >= 10").average(:likert_score) # academic_year:, language:, grade: school.grades(academic_year:)).group(:survey_item).having("count(*) >= 10").average(:likert_score)
#
#
# Parent.joins(:languages).where(languages: {designation: "Spanish"})
# SurveyItemResponse.joins([parent: :languages]).where(languages: {designation: "English"}).first
} }
def self.grouped_responses(school:, academic_year:) def self.grouped_responses(school:, academic_year:)
@grouped_responses ||= Hash.new do |memo, (school, academic_year)| @grouped_responses ||= Hash.new do |memo, (school, academic_year)|

@ -20,6 +20,9 @@ class SurveyItemValues
row["Progress Count"] = progress row["Progress Count"] = progress
row["Race"] ||= races.join(",") row["Race"] ||= races.join(",")
row["Gender"] ||= gender row["Gender"] ||= gender
row["Raw Housing Status"] = raw_housing
row["Housing Status"] = housing
row["Home Languages"] = languages.join(",")
copy_data_to_main_column(main: /Race/i, secondary: /Race Secondary|Race-1/i) copy_data_to_main_column(main: /Race/i, secondary: /Race Secondary|Race-1/i)
copy_data_to_main_column(main: /Gender/i, secondary: /Gender Secondary|Gender-1/i) copy_data_to_main_column(main: /Gender/i, secondary: /Gender Secondary|Gender-1/i)
@ -195,6 +198,28 @@ class SurveyItemValues
@sped ||= Sped.to_designation(raw_sped) @sped ||= Sped.to_designation(raw_sped)
end end
def raw_housing
@raw_housing ||= value_from(pattern: /Housing/i)
end
def housing
@housing ||= Housing.to_designation(raw_housing)
end
def raw_language
@raw_language ||= value_from(pattern: /^Language$/i)
end
def languages
@languages ||= [].tap do |languages|
if raw_language.present?
raw_language.split(",").each do |item|
languages << Language.to_designation(item)
end
end
end
end
def number_of_children def number_of_children
@number_of_children ||= value_from(pattern: /Number\s*Of\s*Children/i).to_i @number_of_children ||= value_from(pattern: /Number\s*Of\s*Children/i).to_i
end end

@ -95,6 +95,10 @@ class SurveyResponsesDataLoader
process_survey_items(row:) process_survey_items(row:)
end end
def languages
@languages ||= Language.by_designation
end
def process_survey_items(row:) def process_survey_items(row:)
student = nil student = nil
parent = nil parent = nil
@ -108,7 +112,9 @@ class SurveyResponsesDataLoader
if row.respondent_type == :parent if row.respondent_type == :parent
parent = Parent.find_or_create_by(response_id: row.response_id) parent = Parent.find_or_create_by(response_id: row.response_id)
parent.number_of_children = row.number_of_children parent.number_of_children = row.number_of_children
parent.language = row.language tmp_languages = row.languages.map { |language| languages[language] }
parent.languages.concat(tmp_languages)
parent.housing = Housing.find_by(designation: row.housing)
parent.save parent.save
end end

@ -0,0 +1,12 @@
class CreateParentLanguages < ActiveRecord::Migration[8.0]
def change
create_table :parent_languages do |t|
t.references :parent, null: false, foreign_key: true
t.references :language, null: false, foreign_key: true
t.timestamps
end
add_index :parent_languages, %i[parent_id language_id]
end
end

@ -0,0 +1,5 @@
class AddDesignationIndexToLanguage < ActiveRecord::Migration[8.0]
def change
add_index :languages, %i[designation]
end
end

@ -0,0 +1,5 @@
class RemoveLanguageFromParent < ActiveRecord::Migration[8.0]
def change
remove_column :parents, :language_id
end
end

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2025_04_15_211114) do ActiveRecord::Schema[8.0].define(version: 2025_04_18_185655) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql" enable_extension "pg_catalog.plpgsql"
enable_extension "pg_stat_statements" enable_extension "pg_stat_statements"
@ -97,6 +97,14 @@ ActiveRecord::Schema[8.0].define(version: 2025_04_15_211114) do
t.index ["slug"], name: "index_incomes_on_slug", unique: true t.index ["slug"], name: "index_incomes_on_slug", unique: true
end end
create_table "languages", force: :cascade do |t|
t.string "designation"
t.string "slug"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["designation"], name: "index_languages_on_designation"
end
create_table "legacy_attempts", id: :serial, force: :cascade do |t| create_table "legacy_attempts", id: :serial, force: :cascade do |t|
t.integer "recipient_id" t.integer "recipient_id"
t.integer "schedule_id" t.integer "schedule_id"
@ -317,15 +325,23 @@ ActiveRecord::Schema[8.0].define(version: 2025_04_15_211114) do
t.index ["subcategory_id"], name: "index_measures_on_subcategory_id" t.index ["subcategory_id"], name: "index_measures_on_subcategory_id"
end end
create_table "parent_languages", force: :cascade do |t|
t.bigint "parent_id", null: false
t.bigint "language_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["language_id"], name: "index_parent_languages_on_language_id"
t.index ["parent_id", "language_id"], name: "index_parent_languages_on_parent_id_and_language_id"
t.index ["parent_id"], name: "index_parent_languages_on_parent_id"
end
create_table "parents", force: :cascade do |t| create_table "parents", force: :cascade do |t|
t.string "response_id" t.string "response_id"
t.integer "number_of_children" t.integer "number_of_children"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.bigint "housing_id", null: false t.bigint "housing_id"
t.bigint "language_id"
t.index ["housing_id"], name: "index_parents_on_housing_id" t.index ["housing_id"], name: "index_parents_on_housing_id"
t.index ["language_id"], name: "index_parents_on_language_id"
end end
create_table "races", force: :cascade do |t| create_table "races", force: :cascade do |t|
@ -514,8 +530,9 @@ ActiveRecord::Schema[8.0].define(version: 2025_04_15_211114) do
add_foreign_key "legacy_school_categories", "legacy_categories", column: "category_id" add_foreign_key "legacy_school_categories", "legacy_categories", column: "category_id"
add_foreign_key "legacy_school_categories", "legacy_schools", column: "school_id" add_foreign_key "legacy_school_categories", "legacy_schools", column: "school_id"
add_foreign_key "measures", "subcategories" add_foreign_key "measures", "subcategories"
add_foreign_key "parent_languages", "languages"
add_foreign_key "parent_languages", "parents"
add_foreign_key "parents", "housings" add_foreign_key "parents", "housings"
add_foreign_key "parents", "languages"
add_foreign_key "respondents", "academic_years" add_foreign_key "respondents", "academic_years"
add_foreign_key "respondents", "schools" add_foreign_key "respondents", "schools"
add_foreign_key "response_rates", "academic_years" add_foreign_key "response_rates", "academic_years"

@ -1,4 +1,17 @@
FactoryBot.define do FactoryBot.define do
factory :parent_language do
parent { nil }
language { nil }
end
factory :language do
designation { "MyString" }
end
factory :housing do
designation { "MyString" }
end
factory :parent do factory :parent do
response_id { "MyString" } response_id { "MyString" }
number_of_children { 1 } number_of_children { 1 }

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe ParentLanguage, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end

@ -414,7 +414,7 @@ RSpec.describe SurveyItemValues, type: :model do
end end
context "when there are multiple races" do context "when there are multiple races" do
it "returns the gender that maps to the gender provided" do it "returns the race that maps to the race provided" do
row = { "Race" => "1,2,3" } row = { "Race" => "1,2,3" }
values = SurveyItemValues.new(row:, headers:, survey_items:, schools:, academic_years:) values = SurveyItemValues.new(row:, headers:, survey_items:, schools:, academic_years:)
expect(values.races).to eq [1, 2, 3, 100] expect(values.races).to eq [1, 2, 3, 100]
@ -452,7 +452,7 @@ RSpec.describe SurveyItemValues, type: :model do
headers.push("HispanicLatino") headers.push("HispanicLatino")
headers.push("Race- SIS") headers.push("Race- SIS")
values = SurveyItemValues.new(row:, headers:, survey_items:, schools:, academic_years:) values = SurveyItemValues.new(row:, headers:, survey_items:, schools:, academic_years:)
expect(values.races).to eq [5, 2, 3, 4, 100] expect(values.races).to eq [2, 3, 4, 100]
end end
end end
end end
@ -567,6 +567,22 @@ RSpec.describe SurveyItemValues, type: :model do
# end # end
end end
context ".language" do
before :each do
attleboro
ay_2022_23
end
it "validates the code matches the expectations defined in the demographic_glossary" do
list = read(demographic_filepath, "Language Value", "Language Type")
list.each do |target, result|
compare("Language", target, [result], :languages)
end
end
end
context ".ell" do context ".ell" do
before :each do before :each do
attleboro attleboro

@ -123,6 +123,13 @@ describe SurveyResponsesDataLoader do
let(:unknown_race) { create(:race, qualtrics_code: 99) } let(:unknown_race) { create(:race, qualtrics_code: 99) }
let(:multiracial) { create(:race, qualtrics_code: 100) } let(:multiracial) { create(:race, qualtrics_code: 100) }
let(:languages){
create(:language, designation: "English")
create(:language, designation: "Spanish")
create(:language, designation: "Portuguese")
create(:language, designation: "Unknown")
}
let(:setup) do let(:setup) do
ay_2020_21 ay_2020_21
ay_2022_23 ay_2022_23
@ -161,6 +168,8 @@ describe SurveyResponsesDataLoader do
middle_eastern middle_eastern
unknown_race unknown_race
multiracial multiracial
languages
end end
before :each do before :each do

Loading…
Cancel
Save