From ee2710552ed566ce7be8b2bbb17cd326c2cd7ae1 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:14:55 +0200 Subject: [PATCH 01/27] create needed_items table --- db/migrate/20240219121949_create_needed_item.rb | 9 +++++++++ db/migrate/20240219122800_populate_needed_items.rb | 7 +++++++ db/schema.rb | 11 ++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20240219121949_create_needed_item.rb create mode 100644 db/migrate/20240219122800_populate_needed_items.rb diff --git a/db/migrate/20240219121949_create_needed_item.rb b/db/migrate/20240219121949_create_needed_item.rb new file mode 100644 index 0000000000..1b54522cd0 --- /dev/null +++ b/db/migrate/20240219121949_create_needed_item.rb @@ -0,0 +1,9 @@ +class CreateNeededItem < ActiveRecord::Migration[7.0] + def change + create_table :needed_items do |t| + t.integer :child_id, null: false, index: true + t.integer :item_id, null: false, index: true + t.timestamps + end + end +end diff --git a/db/migrate/20240219122800_populate_needed_items.rb b/db/migrate/20240219122800_populate_needed_items.rb new file mode 100644 index 0000000000..1282600cc3 --- /dev/null +++ b/db/migrate/20240219122800_populate_needed_items.rb @@ -0,0 +1,7 @@ +class PopulateNeededItems < ActiveRecord::Migration[7.0] + def change + Partners::Child.find_each do |child| + child.needed_item_ids = [child.item_needed_diaperid] if child.item_needed_diaperid.present? + end + end +end diff --git a/db/schema.rb b/db/schema.rb index ec0fb34d6a..26f7dbf784 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_02_07_202431) do +ActiveRecord::Schema[7.0].define(version: 2024_02_19_122800) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -452,6 +452,15 @@ t.datetime "updated_at", null: false end + create_table "needed_items", force: :cascade do |t| + t.integer "child_id", null: false + t.integer "item_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["child_id"], name: "index_needed_items_on_child_id" + t.index ["item_id"], name: "index_needed_items_on_item_id" + end + create_table "organizations", id: :serial, force: :cascade do |t| t.string "name" t.string "short_name" From 29a418747e8bb656b59bad2f803af039b806de2f Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:16:57 +0200 Subject: [PATCH 02/27] add needed_item_ids to children controller --- app/controllers/partners/children_controller.rb | 4 ++-- app/views/partners/children/_form.html.erb | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/partners/children_controller.rb b/app/controllers/partners/children_controller.rb index 64b8033934..0c2c42ae28 100644 --- a/app/controllers/partners/children_controller.rb +++ b/app/controllers/partners/children_controller.rb @@ -88,11 +88,11 @@ def child_params :first_name, :gender, :health_insurance, - :item_needed_diaperid, :last_name, :race, :archived, - child_lives_with: [] + child_lives_with: [], + needed_item_ids: [] ) end diff --git a/app/views/partners/children/_form.html.erb b/app/views/partners/children/_form.html.erb index 5a8795941b..7cfc9747b7 100644 --- a/app/views/partners/children/_form.html.erb +++ b/app/views/partners/children/_form.html.erb @@ -17,10 +17,10 @@ <%= form.text_field :last_name, class: "form-control" %> <%= form.label :item_needed, "Diaper/Item Used" %> - <%= form.select :item_needed_diaperid, @formatted_requestable_items, - {include_blank: 'Select an item'}, - {class: 'form-control'} %> -
+ (select multiple by holding `ctrl`) + <%= form.select :needed_item_ids, @formatted_requestable_items, + {include_blank: false, include_hidden: false, selected: child.needed_item_ids}, + {class: 'form-control', multiple: true} %> <%= form.input :date_of_birth, as: :date, start_year: 20.years.ago.year, end_year: Time.current.year, label: "Date of Birth" %> <%= form.input :gender, collection: ["Male", "Female"], class: "form-control" %> From 791a882c057bdc5b659dbf9b85e41f2b3a1719aa Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:18:28 +0200 Subject: [PATCH 03/27] add needed_items to Child model --- app/models/partners/child.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/partners/child.rb b/app/models/partners/child.rb index 1421bd47a1..95c3c6cf24 100644 --- a/app/models/partners/child.rb +++ b/app/models/partners/child.rb @@ -11,7 +11,8 @@ # first_name :string # gender :string # health_insurance :jsonb -# item_needed_diaperid :integer +# item_needed_diaperid :integer # DEPRECATED +# items_needed_ids :string # last_name :string # race :jsonb # created_at :datetime not null @@ -25,6 +26,7 @@ class Child < Base serialize :child_lives_with, Array belongs_to :family has_many :child_item_requests, dependent: :destroy + has_and_belongs_to_many :needed_items, class_name: 'Item', join_table: :needed_items include Filterable include Exportable @@ -88,7 +90,7 @@ def display_name def self.csv_export_headers %w[ id first_name last_name date_of_birth gender child_lives_with race agency_child_id - health_insurance comments created_at updated_at family_id item_needed_diaperid active archived + health_insurance comments created_at updated_at family_id needed_item_ids active archived ].freeze end @@ -107,7 +109,7 @@ def csv_export_attributes created_at, updated_at, family_id, - item_needed_diaperid, + needed_item_ids, active, archived ] From 781afa26f7351c462d89d29533be2c65feaf6b04 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:19:29 +0200 Subject: [PATCH 04/27] update views with needed_items --- app/views/partners/children/_child.json.jbuilder | 2 +- app/views/partners/children/show.html.erb | 7 ++++++- app/views/partners/family_requests/_list.html.erb | 8 +++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/views/partners/children/_child.json.jbuilder b/app/views/partners/children/_child.json.jbuilder index 63ae89cc65..7368b28458 100644 --- a/app/views/partners/children/_child.json.jbuilder +++ b/app/views/partners/children/_child.json.jbuilder @@ -1,2 +1,2 @@ -json.extract! child, :id, :first_name, :last_name, :date_of_birth, :gender, :child_lives_with, :race, :agency_child_id, :health_insurance, :item_needed_diaperid, :comments, :created_at, :updated_at +json.extract! child, :id, :first_name, :last_name, :date_of_birth, :gender, :child_lives_with, :race, :agency_child_id, :health_insurance, :needed_item_ids, :comments, :created_at, :updated_at json.url child_url(child, format: :json) diff --git a/app/views/partners/children/show.html.erb b/app/views/partners/children/show.html.erb index 45e28aa0ed..df609265b6 100644 --- a/app/views/partners/children/show.html.erb +++ b/app/views/partners/children/show.html.erb @@ -59,7 +59,12 @@
<%= @child.health_insurance %>
Item needed:
-
<%= current_partner.organization.item_id_to_display_string_map[@child.item_needed_diaperid] %>
+
+ <% @child.needed_item_ids.each do |item_id| %> + <%= current_partner.organization.item_id_to_display_string_map[item_id] %> +
+ <% end %> +
Comments:
<%= @child.comments %>
diff --git a/app/views/partners/family_requests/_list.html.erb b/app/views/partners/family_requests/_list.html.erb index eae0c9a29e..cb19f012a1 100644 --- a/app/views/partners/family_requests/_list.html.erb +++ b/app/views/partners/family_requests/_list.html.erb @@ -18,15 +18,17 @@ <%= child.first_name %> <%= child.last_name %> - <% if child.item_needed_diaperid %> - <%= current_partner.organization.item_id_to_display_string_map[child.item_needed_diaperid] %> + <% if child.needed_item_ids.present? %> + <% child.needed_item_ids.each do |item_id| %> + <%= current_partner.organization.item_id_to_display_string_map[item_id] %> + <% end %> <% else %> <%= "N/A" %> <% end %>
- <% if child.item_needed_diaperid %> + <% if child.needed_item_ids.present? %> <%= check_box_tag "child-#{child.id}", child.active, child.active, class: "custom-control-input", id: "child-#{child.id}" %> From 2284dcdd0b344a9b6e8d8e55e3481838d7a1474b Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:22:42 +0200 Subject: [PATCH 05/27] comment: TODO: drop items_needed_ids after issue #3797 released to prod --- app/models/partners/child.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/partners/child.rb b/app/models/partners/child.rb index 95c3c6cf24..e9f3817e3c 100644 --- a/app/models/partners/child.rb +++ b/app/models/partners/child.rb @@ -117,3 +117,4 @@ def csv_export_attributes end end +# TODO: drop items_needed_ids after issue #3797 released to prod From 30ca7ac7c51bc308562455d345971f796679a329 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:35:21 +0200 Subject: [PATCH 06/27] update Child factory --- spec/factories/partners/child.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/factories/partners/child.rb b/spec/factories/partners/child.rb index 6b4b60b43c..e433053897 100644 --- a/spec/factories/partners/child.rb +++ b/spec/factories/partners/child.rb @@ -9,6 +9,6 @@ first_name { Faker::Name.first_name } last_name { Faker::Name.last_name } gender { Faker::Gender.binary_type } - item_needed_diaperid { Item.all.sample.id } + needed_item_ids { [Item.all.sample.id] } end end From f803c7df53715a5ada54e2fac22cf4cfcc4ffa9b Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:36:38 +0200 Subject: [PATCH 07/27] enhance view of needed items in the lists --- app/views/partners/children/show.html.erb | 7 +++---- app/views/partners/family_requests/_list.html.erb | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/views/partners/children/show.html.erb b/app/views/partners/children/show.html.erb index df609265b6..c5b141eb72 100644 --- a/app/views/partners/children/show.html.erb +++ b/app/views/partners/children/show.html.erb @@ -60,10 +60,9 @@
Item needed:
- <% @child.needed_item_ids.each do |item_id| %> - <%= current_partner.organization.item_id_to_display_string_map[item_id] %> -
- <% end %> + <%= @child.needed_item_ids.map do |item_id| + current_partner.organization.item_id_to_display_string_map[item_id] + end.join(', ') %>
Comments:
diff --git a/app/views/partners/family_requests/_list.html.erb b/app/views/partners/family_requests/_list.html.erb index cb19f012a1..ed946c346b 100644 --- a/app/views/partners/family_requests/_list.html.erb +++ b/app/views/partners/family_requests/_list.html.erb @@ -19,9 +19,9 @@ <% if child.needed_item_ids.present? %> - <% child.needed_item_ids.each do |item_id| %> - <%= current_partner.organization.item_id_to_display_string_map[item_id] %> - <% end %> + <%= child.needed_item_ids.map do |item_id| + current_partner.organization.item_id_to_display_string_map[item_id] + end.join(', ') %> <% else %> <%= "N/A" %> <% end %> From 2ccbb641969f070942f92b0d50cd1da2c11f198f Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:37:09 +0200 Subject: [PATCH 08/27] remove item_needed_diaperid from seed.rb --- db/seeds.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 7da24334b8..f51f19896c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -304,7 +304,7 @@ def random_record_for_org(org, klass) comments: Faker::Lorem.paragraph, active: Faker::Boolean.boolean, archived: false, - item_needed_diaperid: p.organization.item_id_to_display_string_map.key(Partners::Child::CHILD_ITEMS.sample) + needed_item_ids: [p.organization.item_id_to_display_string_map.key(Partners::Child::CHILD_ITEMS.sample)] ) end @@ -322,7 +322,7 @@ def random_record_for_org(org, klass) comments: Faker::Lorem.paragraph, active: Faker::Boolean.boolean, archived: false, - item_needed_diaperid: p.organization.item_id_to_display_string_map.key(Partners::Child::CHILD_ITEMS.sample) + needed_item_ids: [p.organization.item_id_to_display_string_map.key(Partners::Child::CHILD_ITEMS.sample)] ) end end From 36b5fcecd0f9413220705c65810f0e443a893548 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:38:12 +0200 Subject: [PATCH 09/27] replace item_needed_diaperid with needed_items in controllers --- app/controllers/partners/family_requests_controller.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/controllers/partners/family_requests_controller.rb b/app/controllers/partners/family_requests_controller.rb index ff91b4b9bc..92c4e6f64c 100644 --- a/app/controllers/partners/family_requests_controller.rb +++ b/app/controllers/partners/family_requests_controller.rb @@ -23,9 +23,12 @@ def create end end - children = current_partner.children.active.where(id: children_ids).where.not(item_needed_diaperid: [nil, 0]) - - children_grouped_by_item_id = children.group_by(&:item_needed_diaperid) + children = current_partner.children.active + .where(id: children_ids) + .joins(:needed_items) + .select('children.*', :item_id) + + children_grouped_by_item_id = children.group_by { |child| child.item_id } family_requests_attributes = children_grouped_by_item_id.map do |item_id, item_requested_children| { item_id: item_id, person_count: item_requested_children.size, children: item_requested_children } end From 7b7a3a1eb781ccc5b584f78f7fe63a7eb77af367 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:38:41 +0200 Subject: [PATCH 10/27] specs --- spec/models/partners/child_spec.rb | 1 + spec/requests/partners/children_requests_spec.rb | 6 +++--- spec/requests/partners/family_requests_controller_spec.rb | 4 ++-- spec/system/partners/family_requests_system_spec.rb | 8 ++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/spec/models/partners/child_spec.rb b/spec/models/partners/child_spec.rb index c8ace29762..8bc3cda656 100644 --- a/spec/models/partners/child_spec.rb +++ b/spec/models/partners/child_spec.rb @@ -25,6 +25,7 @@ describe 'associations' do it { should belong_to(:family) } it { should have_many(:child_item_requests).dependent(:destroy) } + it { should have_and_belong_to_many(:needed_items).class_name('Item').join_table(:needed_items) } end describe "#display_name" do diff --git a/spec/requests/partners/children_requests_spec.rb b/spec/requests/partners/children_requests_spec.rb index ca42e7386a..cd3dcf1e75 100644 --- a/spec/requests/partners/children_requests_spec.rb +++ b/spec/requests/partners/children_requests_spec.rb @@ -15,7 +15,7 @@ agency_child_id: "Agency McAgence", health_insurance: "Private insurance", comments: "Some comment", - item_needed_diaperid: nil, + needed_item_ids: nil, active: true, archived: false, family: family) @@ -31,7 +31,7 @@ agency_child_id: "Agency McAgence", health_insurance: "Private insurance", comments: "Some comment", - item_needed_diaperid: nil, + needed_item_ids: nil, active: true, archived: false, family: family) @@ -51,7 +51,7 @@ headers = {"Accept" => "text/csv", "Content-Type" => "text/csv"} get partners_children_path, headers: headers csv = <<~CSV - id,first_name,last_name,date_of_birth,gender,child_lives_with,race,agency_child_id,health_insurance,comments,created_at,updated_at,family_id,item_needed_diaperid,active,archived + id,first_name,last_name,date_of_birth,gender,child_lives_with,race,agency_child_id,health_insurance,comments,created_at,updated_at,family_id,needed_item_ids,active,archived #{child1.id},John,Smith,2019-01-01,Male,"mother,grandfather",Other,Agency McAgence,Private insurance,Some comment,#{child1.created_at},#{child1.updated_at},#{family.id},"",true,false #{child2.id},Jane,Smith,2018-01-01,Female,father,Hispanic,Agency McAgence,Private insurance,Some comment,#{child2.created_at},#{child2.updated_at},#{family.id},"",true,false CSV diff --git a/spec/requests/partners/family_requests_controller_spec.rb b/spec/requests/partners/family_requests_controller_spec.rb index 04b17f75f2..a2d3a103de 100644 --- a/spec/requests/partners/family_requests_controller_spec.rb +++ b/spec/requests/partners/family_requests_controller_spec.rb @@ -32,9 +32,9 @@ describe 'POST #create' do before do # Set one child as deactivated and the other as active but - # without a item_needed_diaperid + # without a needed items children[0].update(active: false) - children[1].update(item_needed_diaperid: nil) + children[1].needed_item_ids = [] end subject { post partners_family_requests_path, params: params } diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index e1030f284a..ad58df1f7b 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -14,9 +14,9 @@ let!(:children) do [ create(:partners_child, family: family), - create(:partners_child, family: family, item_needed_diaperid: item_id), - create(:partners_child, family: family, item_needed_diaperid: item_id), - create(:partners_child, family: other_family, item_needed_diaperid: item_id), + create(:partners_child, family: family, needed_item_ids: item_id), + create(:partners_child, family: family, needed_item_ids: item_id), + create(:partners_child, family: other_family, needed_item_ids: item_id), create(:partners_child, family: other_family) ] end @@ -29,7 +29,7 @@ click_link "Your Previous Requests" expect(page).to have_text("Request History") expect(Partners::ChildItemRequest.pluck(:child_id)).to match_array(children.pluck(:id)) - expect(Partners::ItemRequest.pluck(:item_id)).to match_array(children.pluck(:item_needed_diaperid).uniq) + expect(Partners::ItemRequest.pluck(:item_id)).to match_array(children.map(&:needed_item_ids).flatten.uniq) end end From 166eb5e0cf5a25a6aea166ca8aced048edcba176 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 19:59:11 +0200 Subject: [PATCH 11/27] rubocop --- app/controllers/partners/family_requests_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/partners/family_requests_controller.rb b/app/controllers/partners/family_requests_controller.rb index 92c4e6f64c..e6a5abfea4 100644 --- a/app/controllers/partners/family_requests_controller.rb +++ b/app/controllers/partners/family_requests_controller.rb @@ -24,10 +24,10 @@ def create end children = current_partner.children.active - .where(id: children_ids) - .joins(:needed_items) - .select('children.*', :item_id) - + .where(id: children_ids) + .joins(:needed_items) + .select('children.*', :item_id) + children_grouped_by_item_id = children.group_by { |child| child.item_id } family_requests_attributes = children_grouped_by_item_id.map do |item_id, item_requested_children| { item_id: item_id, person_count: item_requested_children.size, children: item_requested_children } From c18c5a4958c0b939dc0e570bfb84cc8abe8bf7e5 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Mon, 19 Feb 2024 20:00:48 +0200 Subject: [PATCH 12/27] rubocop --- spec/factories/partners/child.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/factories/partners/child.rb b/spec/factories/partners/child.rb index e433053897..8b4339aeaa 100644 --- a/spec/factories/partners/child.rb +++ b/spec/factories/partners/child.rb @@ -9,6 +9,6 @@ first_name { Faker::Name.first_name } last_name { Faker::Name.last_name } gender { Faker::Gender.binary_type } - needed_item_ids { [Item.all.sample.id] } + needed_item_ids { [Item.all.sample.id] } end end From 3a43674610cfcffc3e402171a067d9b4da290af2 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 00:03:47 +0200 Subject: [PATCH 13/27] remove mention about not existing column items_needed_ids --- app/models/partners/child.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/partners/child.rb b/app/models/partners/child.rb index e9f3817e3c..1b01f6c4cc 100644 --- a/app/models/partners/child.rb +++ b/app/models/partners/child.rb @@ -12,7 +12,6 @@ # gender :string # health_insurance :jsonb # item_needed_diaperid :integer # DEPRECATED -# items_needed_ids :string # last_name :string # race :jsonb # created_at :datetime not null @@ -117,4 +116,4 @@ def csv_export_attributes end end -# TODO: drop items_needed_ids after issue #3797 released to prod +# TODO: drop item_needed_diaperid after issue #3797 released to prod From 8cee0f617eac20c91b09ea1c6226f217ba03f2cc Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 00:07:16 +0200 Subject: [PATCH 14/27] use {} instead of do..end with map in erb --- app/views/partners/children/show.html.erb | 4 ++-- app/views/partners/family_requests/_list.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/partners/children/show.html.erb b/app/views/partners/children/show.html.erb index c5b141eb72..75019c664f 100644 --- a/app/views/partners/children/show.html.erb +++ b/app/views/partners/children/show.html.erb @@ -60,9 +60,9 @@
Item needed:
- <%= @child.needed_item_ids.map do |item_id| + <%= @child.needed_item_ids.map{|item_id| current_partner.organization.item_id_to_display_string_map[item_id] - end.join(', ') %> + }.join(', ') %>
Comments:
diff --git a/app/views/partners/family_requests/_list.html.erb b/app/views/partners/family_requests/_list.html.erb index 1ab17fb196..26067ffc08 100644 --- a/app/views/partners/family_requests/_list.html.erb +++ b/app/views/partners/family_requests/_list.html.erb @@ -19,9 +19,9 @@ <% if child.needed_item_ids.present? %> - <%= child.needed_item_ids.map do |item_id| + <%= child.needed_item_ids.map{|item_id| current_partner.organization.item_id_to_display_string_map[item_id] - end.join(', ') %> + }.join(', ') %> <% else %> <%= "N/A" %> <% end %> From a94971ff332a44efadb70d7353d3c5eaaa0f272d Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 00:18:46 +0200 Subject: [PATCH 15/27] use shorter syntax for group_by --- app/controllers/partners/family_requests_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/partners/family_requests_controller.rb b/app/controllers/partners/family_requests_controller.rb index e6a5abfea4..fdcd0a5493 100644 --- a/app/controllers/partners/family_requests_controller.rb +++ b/app/controllers/partners/family_requests_controller.rb @@ -28,7 +28,7 @@ def create .joins(:needed_items) .select('children.*', :item_id) - children_grouped_by_item_id = children.group_by { |child| child.item_id } + children_grouped_by_item_id = children.group_by(&:item_id) family_requests_attributes = children_grouped_by_item_id.map do |item_id, item_requested_children| { item_id: item_id, person_count: item_requested_children.size, children: item_requested_children } end From 6227f724e9b7f506933d42c1d022d745f028f096 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 10:01:02 +0200 Subject: [PATCH 16/27] use rails conventional approach to implement needed child items --- app/models/partners/child.rb | 2 +- .../20240219122800_populate_needed_items.rb | 7 ------ db/schema.rb | 23 +++++++++++-------- 3 files changed, 14 insertions(+), 18 deletions(-) delete mode 100644 db/migrate/20240219122800_populate_needed_items.rb diff --git a/app/models/partners/child.rb b/app/models/partners/child.rb index 1b01f6c4cc..473a240e11 100644 --- a/app/models/partners/child.rb +++ b/app/models/partners/child.rb @@ -25,7 +25,7 @@ class Child < Base serialize :child_lives_with, Array belongs_to :family has_many :child_item_requests, dependent: :destroy - has_and_belongs_to_many :needed_items, class_name: 'Item', join_table: :needed_items + has_and_belongs_to_many :needed_items, class_name: 'Item' include Filterable include Exportable diff --git a/db/migrate/20240219122800_populate_needed_items.rb b/db/migrate/20240219122800_populate_needed_items.rb deleted file mode 100644 index 1282600cc3..0000000000 --- a/db/migrate/20240219122800_populate_needed_items.rb +++ /dev/null @@ -1,7 +0,0 @@ -class PopulateNeededItems < ActiveRecord::Migration[7.0] - def change - Partners::Child.find_each do |child| - child.needed_item_ids = [child.item_needed_diaperid] if child.item_needed_diaperid.present? - end - end -end diff --git a/db/schema.rb b/db/schema.rb index 26f7dbf784..9400ab2151 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_02_19_122800) do +ActiveRecord::Schema[7.0].define(version: 2024_02_21_072115) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -169,6 +169,16 @@ t.index ["item_request_id"], name: "index_child_item_requests_on_item_request_id" end + create_table "child_items", force: :cascade do |t| + t.bigint "child_id", null: false + t.bigint "item_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["child_id", "item_id"], name: "index_child_items_on_child_id_and_item_id", unique: true + t.index ["child_id"], name: "index_child_items_on_child_id" + t.index ["item_id"], name: "index_child_items_on_item_id" + end + create_table "children", force: :cascade do |t| t.string "first_name" t.string "last_name" @@ -452,15 +462,6 @@ t.datetime "updated_at", null: false end - create_table "needed_items", force: :cascade do |t| - t.integer "child_id", null: false - t.integer "item_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["child_id"], name: "index_needed_items_on_child_id" - t.index ["item_id"], name: "index_needed_items_on_item_id" - end - create_table "organizations", id: :serial, force: :cascade do |t| t.string "name" t.string "short_name" @@ -869,6 +870,8 @@ add_foreign_key "broadcast_announcements", "users" add_foreign_key "child_item_requests", "children" add_foreign_key "child_item_requests", "item_requests" + add_foreign_key "child_items", "children" + add_foreign_key "child_items", "items" add_foreign_key "children", "families" add_foreign_key "distributions", "partners" add_foreign_key "distributions", "storage_locations" From 0e957effad946e067973a96fbf22014881f583cd Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 10:24:52 +0200 Subject: [PATCH 17/27] migrations --- .../20240221071948_drop_needed_items.rb | 5 +++ ...0221072117_create_join_table_child_item.rb | 12 +++++++ .../20240221072118_populate_needed_items.rb | 7 +++++ db/schema.rb | 31 ++++++++++--------- 4 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 db/migrate/20240221071948_drop_needed_items.rb create mode 100644 db/migrate/20240221072117_create_join_table_child_item.rb create mode 100644 db/migrate/20240221072118_populate_needed_items.rb diff --git a/db/migrate/20240221071948_drop_needed_items.rb b/db/migrate/20240221071948_drop_needed_items.rb new file mode 100644 index 0000000000..3fa84b5855 --- /dev/null +++ b/db/migrate/20240221071948_drop_needed_items.rb @@ -0,0 +1,5 @@ +class DropNeededItems < ActiveRecord::Migration[7.0] + def change + drop_table :needed_items + end +end diff --git a/db/migrate/20240221072117_create_join_table_child_item.rb b/db/migrate/20240221072117_create_join_table_child_item.rb new file mode 100644 index 0000000000..5be9339cfc --- /dev/null +++ b/db/migrate/20240221072117_create_join_table_child_item.rb @@ -0,0 +1,12 @@ +class CreateJoinTableChildItem < ActiveRecord::Migration[7.0] + def change + create_table :children_items do |t| + t.references :child, null: false, foreign_key: true + t.references :item, null: false, foreign_key: true + + t.timestamps + end + + add_index :children_items, [:child_id, :item_id], unique: true + end +end diff --git a/db/migrate/20240221072118_populate_needed_items.rb b/db/migrate/20240221072118_populate_needed_items.rb new file mode 100644 index 0000000000..1282600cc3 --- /dev/null +++ b/db/migrate/20240221072118_populate_needed_items.rb @@ -0,0 +1,7 @@ +class PopulateNeededItems < ActiveRecord::Migration[7.0] + def change + Partners::Child.find_each do |child| + child.needed_item_ids = [child.item_needed_diaperid] if child.item_needed_diaperid.present? + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 9400ab2151..bf1b32e24f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_02_21_072115) do +ActiveRecord::Schema[7.0].define(version: 2024_02_21_072118) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -169,16 +169,6 @@ t.index ["item_request_id"], name: "index_child_item_requests_on_item_request_id" end - create_table "child_items", force: :cascade do |t| - t.bigint "child_id", null: false - t.bigint "item_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["child_id", "item_id"], name: "index_child_items_on_child_id_and_item_id", unique: true - t.index ["child_id"], name: "index_child_items_on_child_id" - t.index ["item_id"], name: "index_child_items_on_item_id" - end - create_table "children", force: :cascade do |t| t.string "first_name" t.string "last_name" @@ -198,6 +188,16 @@ t.index ["family_id"], name: "index_children_on_family_id" end + create_table "children_items", force: :cascade do |t| + t.bigint "child_id", null: false + t.bigint "item_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["child_id", "item_id"], name: "index_children_items_on_child_id_and_item_id", unique: true + t.index ["child_id"], name: "index_children_items_on_child_id" + t.index ["item_id"], name: "index_children_items_on_item_id" + end + create_table "counties", force: :cascade do |t| t.string "name" t.string "region" @@ -243,8 +243,8 @@ t.integer "organization_id" t.datetime "issued_at", precision: nil t.string "agency_rep" - t.integer "state", default: 5, null: false t.boolean "reminder_email_enabled", default: false, null: false + t.integer "state", default: 5, null: false t.integer "delivery_method", default: 0, null: false t.decimal "shipping_cost", precision: 8, scale: 2 t.index ["organization_id"], name: "index_distributions_on_organization_id" @@ -850,7 +850,8 @@ end create_table "versions", force: :cascade do |t| - t.string "item_type", null: false + t.string "item_type" + t.string "{:null=>false}" t.bigint "item_id", null: false t.string "event", null: false t.string "whodunnit" @@ -870,9 +871,9 @@ add_foreign_key "broadcast_announcements", "users" add_foreign_key "child_item_requests", "children" add_foreign_key "child_item_requests", "item_requests" - add_foreign_key "child_items", "children" - add_foreign_key "child_items", "items" add_foreign_key "children", "families" + add_foreign_key "children_items", "children" + add_foreign_key "children_items", "items" add_foreign_key "distributions", "partners" add_foreign_key "distributions", "storage_locations" add_foreign_key "donations", "manufacturers" From 912c6e90f7747acefeb3715bdbce9be7d387c822 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 10:42:33 +0200 Subject: [PATCH 18/27] revert unrelated automatic schema changes --- db/schema.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index bf1b32e24f..af530fefd2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -243,8 +243,8 @@ t.integer "organization_id" t.datetime "issued_at", precision: nil t.string "agency_rep" - t.boolean "reminder_email_enabled", default: false, null: false t.integer "state", default: 5, null: false + t.boolean "reminder_email_enabled", default: false, null: false t.integer "delivery_method", default: 0, null: false t.decimal "shipping_cost", precision: 8, scale: 2 t.index ["organization_id"], name: "index_distributions_on_organization_id" @@ -850,8 +850,7 @@ end create_table "versions", force: :cascade do |t| - t.string "item_type" - t.string "{:null=>false}" + t.string "item_type", null: false t.bigint "item_id", null: false t.string "event", null: false t.string "whodunnit" From 2114d33536245cb529e118a8988c09cb914af835 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:00:20 +0200 Subject: [PATCH 19/27] fix specs --- spec/models/partners/child_spec.rb | 2 +- .../partners/family_requests_system_spec.rb | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/spec/models/partners/child_spec.rb b/spec/models/partners/child_spec.rb index 8bc3cda656..ce6bdcd82b 100644 --- a/spec/models/partners/child_spec.rb +++ b/spec/models/partners/child_spec.rb @@ -25,7 +25,7 @@ describe 'associations' do it { should belong_to(:family) } it { should have_many(:child_item_requests).dependent(:destroy) } - it { should have_and_belong_to_many(:needed_items).class_name('Item').join_table(:needed_items) } + it { should have_and_belong_to_many(:needed_items).class_name('Item') } end describe "#display_name" do diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index ad58df1f7b..cf1785ce86 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -10,13 +10,13 @@ end describe "for children with different items, from different families" do - let(:item_id) { Item.all.sample.id } + let(:item_ids) { Item.pluck(:id).sample(2) } let!(:children) do [ create(:partners_child, family: family), - create(:partners_child, family: family, needed_item_ids: item_id), - create(:partners_child, family: family, needed_item_ids: item_id), - create(:partners_child, family: other_family, needed_item_ids: item_id), + create(:partners_child, family: family, needed_item_ids: item_ids), + create(:partners_child, family: family, needed_item_ids: item_ids), + create(:partners_child, family: other_family, needed_item_ids: item_ids), create(:partners_child, family: other_family) ] end @@ -28,7 +28,16 @@ expect(page).to have_text("Request Details") click_link "Your Previous Requests" expect(page).to have_text("Request History") - expect(Partners::ChildItemRequest.pluck(:child_id)).to match_array(children.pluck(:id)) + + requests = Partners::ChildItemRequest.all + expect(requests[0].child).to eq(children[0]) + expect(requests[1].child).to eq(children[1]) + expect(requests[2].child).to eq(children[2]) + expect(requests[3].child).to eq(children[3]) + expect(requests[4].child).to eq(children[1]) + expect(requests[5].child).to eq(children[2]) + expect(requests[6].child).to eq(children[3]) + expect(requests[7].child).to eq(children[4]) expect(Partners::ItemRequest.pluck(:item_id)).to match_array(children.map(&:needed_item_ids).flatten.uniq) end end From 7e9749dca5c3c36dac88b31ecd701d821cf2a76a Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:03:51 +0200 Subject: [PATCH 20/27] remove db/migrate/20240219121949_create_needed_item.rb --- db/migrate/20240219121949_create_needed_item.rb | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 db/migrate/20240219121949_create_needed_item.rb diff --git a/db/migrate/20240219121949_create_needed_item.rb b/db/migrate/20240219121949_create_needed_item.rb deleted file mode 100644 index 1b54522cd0..0000000000 --- a/db/migrate/20240219121949_create_needed_item.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateNeededItem < ActiveRecord::Migration[7.0] - def change - create_table :needed_items do |t| - t.integer :child_id, null: false, index: true - t.integer :item_id, null: false, index: true - t.timestamps - end - end -end From 5958c6b8da82cba60cac28daee4e36d3ce07ff15 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:36:48 +0200 Subject: [PATCH 21/27] fix spec --- .../partners/family_requests_system_spec.rb | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index cf1785ce86..c6f2c1f088 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -13,11 +13,11 @@ let(:item_ids) { Item.pluck(:id).sample(2) } let!(:children) do [ - create(:partners_child, family: family), - create(:partners_child, family: family, needed_item_ids: item_ids), - create(:partners_child, family: family, needed_item_ids: item_ids), - create(:partners_child, family: other_family, needed_item_ids: item_ids), - create(:partners_child, family: other_family) + FactoryBot.create(:partners_child, family: family), + FactoryBot.create(:partners_child, family: family, needed_item_ids: item_ids), + FactoryBot.create(:partners_child, family: family, needed_item_ids: item_ids), + FactoryBot.create(:partners_child, family: other_family, needed_item_ids: item_ids), + FactoryBot.create(:partners_child, family: other_family) ] end @@ -30,14 +30,11 @@ expect(page).to have_text("Request History") requests = Partners::ChildItemRequest.all - expect(requests[0].child).to eq(children[0]) - expect(requests[1].child).to eq(children[1]) - expect(requests[2].child).to eq(children[2]) - expect(requests[3].child).to eq(children[3]) - expect(requests[4].child).to eq(children[1]) - expect(requests[5].child).to eq(children[2]) - expect(requests[6].child).to eq(children[3]) - expect(requests[7].child).to eq(children[4]) + expect(children[0].child_item_requests.size).to eq(1) + expect(children[1].child_item_requests.size).to eq(2) + expect(children[2].child_item_requests.size).to eq(2) + expect(children[3].child_item_requests.size).to eq(2) + expect(children[4].child_item_requests.size).to eq(1) expect(Partners::ItemRequest.pluck(:item_id)).to match_array(children.map(&:needed_item_ids).flatten.uniq) end end From 2ef7ffd484b94973631a4aa7a45454e4e3c77dd1 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:39:10 +0200 Subject: [PATCH 22/27] fix spec --- spec/system/partners/family_requests_system_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index c6f2c1f088..eb2fbe706d 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -13,11 +13,11 @@ let(:item_ids) { Item.pluck(:id).sample(2) } let!(:children) do [ - FactoryBot.create(:partners_child, family: family), - FactoryBot.create(:partners_child, family: family, needed_item_ids: item_ids), - FactoryBot.create(:partners_child, family: family, needed_item_ids: item_ids), - FactoryBot.create(:partners_child, family: other_family, needed_item_ids: item_ids), - FactoryBot.create(:partners_child, family: other_family) + create(:partners_child, family: family), + create(:partners_child, family: family, needed_item_ids: item_ids), + create(:partners_child, family: family, needed_item_ids: item_ids), + create(:partners_child, family: other_family, needed_item_ids: item_ids), + create(:partners_child, family: other_family) ] end From 05c5142ad991750519bda7e9973ec79c475abb36 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:44:04 +0200 Subject: [PATCH 23/27] fix spec --- spec/system/partners/family_requests_system_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index eb2fbe706d..f456d6f2b1 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -29,7 +29,7 @@ click_link "Your Previous Requests" expect(page).to have_text("Request History") - requests = Partners::ChildItemRequest.all + Partners::ChildItemRequest.all expect(children[0].child_item_requests.size).to eq(1) expect(children[1].child_item_requests.size).to eq(2) expect(children[2].child_item_requests.size).to eq(2) From 9513c9b7cdf1ec762879ebfb5b719a08101232d1 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 11:45:41 +0200 Subject: [PATCH 24/27] fix spec --- spec/system/partners/family_requests_system_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index f456d6f2b1..265298db4f 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -29,7 +29,6 @@ click_link "Your Previous Requests" expect(page).to have_text("Request History") - Partners::ChildItemRequest.all expect(children[0].child_item_requests.size).to eq(1) expect(children[1].child_item_requests.size).to eq(2) expect(children[2].child_item_requests.size).to eq(2) From a9f8bc295a57dd081be84bde8a31bb917712dfe6 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Wed, 21 Feb 2024 15:15:43 +0200 Subject: [PATCH 25/27] fix spec --- spec/system/partners/family_requests_system_spec.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/system/partners/family_requests_system_spec.rb b/spec/system/partners/family_requests_system_spec.rb index 265298db4f..8775eba7bc 100644 --- a/spec/system/partners/family_requests_system_spec.rb +++ b/spec/system/partners/family_requests_system_spec.rb @@ -10,7 +10,7 @@ end describe "for children with different items, from different families" do - let(:item_ids) { Item.pluck(:id).sample(2) } + let(:item_ids) { Item.pluck(:id).sample(2).sort } let!(:children) do [ create(:partners_child, family: family), @@ -34,6 +34,9 @@ expect(children[2].child_item_requests.size).to eq(2) expect(children[3].child_item_requests.size).to eq(2) expect(children[4].child_item_requests.size).to eq(1) + expect(children[1].child_item_requests.map(&:item_request).map(&:item_id).sort).to eq(item_ids) + expect(children[2].child_item_requests.map(&:item_request).map(&:item_id).sort).to eq(item_ids) + expect(children[3].child_item_requests.map(&:item_request).map(&:item_id).sort).to eq(item_ids) expect(Partners::ItemRequest.pluck(:item_id)).to match_array(children.map(&:needed_item_ids).flatten.uniq) end end From 8a823fe37654a82362d5d80014238e8fd6ec48d2 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Thu, 22 Feb 2024 13:18:01 +0200 Subject: [PATCH 26/27] remove comment --- app/models/partners/child.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/partners/child.rb b/app/models/partners/child.rb index 473a240e11..e0899d29a9 100644 --- a/app/models/partners/child.rb +++ b/app/models/partners/child.rb @@ -11,7 +11,7 @@ # first_name :string # gender :string # health_insurance :jsonb -# item_needed_diaperid :integer # DEPRECATED +# item_needed_diaperid :integer # last_name :string # race :jsonb # created_at :datetime not null From cc81a6990bf576e170d243a6e1ea23d492d42212 Mon Sep 17 00:00:00 2001 From: isidzukuri Date: Thu, 22 Feb 2024 13:19:15 +0200 Subject: [PATCH 27/27] remove useless wip migration --- db/migrate/20240221071948_drop_needed_items.rb | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 db/migrate/20240221071948_drop_needed_items.rb diff --git a/db/migrate/20240221071948_drop_needed_items.rb b/db/migrate/20240221071948_drop_needed_items.rb deleted file mode 100644 index 3fa84b5855..0000000000 --- a/db/migrate/20240221071948_drop_needed_items.rb +++ /dev/null @@ -1,5 +0,0 @@ -class DropNeededItems < ActiveRecord::Migration[7.0] - def change - drop_table :needed_items - end -end