From 087e438eb691b3673b2be00202f12197c89e50fe Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 2 Mar 2022 11:26:53 +0100 Subject: [PATCH 1/3] models: delete AdministrateursInstructeur when destroying Instructeur By default, `has_and_belongs_to_many` properly deletes the record in the join table. However, as the association is declared manually with a `has_many / through`, it doesn't delete the joined record automatically. As we also lack a foreign-key contraint on the join table, that means a dangling record remains in the join table. To fix this, let's declare it a proper `has_and_belongs_to_many` association, which will let the join record be deleted automatically on destroy. --- app/models/instructeur.rb | 3 +-- spec/models/instructeur_spec.rb | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index 8f72114cd..9c5d07a2b 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -11,8 +11,7 @@ # agent_connect_id :string # class Instructeur < ApplicationRecord - has_many :administrateurs_instructeurs - has_many :administrateurs, through: :administrateurs_instructeurs + has_and_belongs_to_many :administrateurs has_many :assign_to, dependent: :destroy has_many :groupe_instructeurs, through: :assign_to diff --git a/spec/models/instructeur_spec.rb b/spec/models/instructeur_spec.rb index bc0c87d94..b108cfe95 100644 --- a/spec/models/instructeur_spec.rb +++ b/spec/models/instructeur_spec.rb @@ -12,6 +12,10 @@ describe Instructeur, type: :model do procedure_3 end + describe 'associations' do + it { is_expected.to have_and_belong_to_many(:administrateurs) } + end + describe 'follow' do let(:dossier) { create :dossier } let(:already_followed_dossier) { create :dossier } From 5eee6b161fc7ce3e212b1eac149c9b0059760fd3 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 2 Mar 2022 10:27:18 +0000 Subject: [PATCH 2/3] db: add foreign key contraints to AdministrateursInstructeur --- ...gn_keys_to_administrateurs_instructeurs.rb | 22 +++++++++++++++++++ db/schema.rb | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb diff --git a/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb b/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb new file mode 100644 index 000000000..fc524565f --- /dev/null +++ b/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb @@ -0,0 +1,22 @@ +class AddForeignKeysToAdministrateursInstructeurs < ActiveRecord::Migration[6.1] + def up + # Sanity check + say_with_time 'Removing AdministrateursInstructeur where the associated Administrateur no longer exists ' do + deleted_administrateurs_ids = AdministrateursInstructeur.where.missing(:administrateur).pluck(:administrateur_id) + AdministrateursInstructeur.where(administrateur_id: deleted_administrateurs_ids).delete_all + end + + say_with_time 'Removing AdministrateursInstructeur where the associated Instructeur no longer exists ' do + deleted_instructeurs_ids = AdministrateursInstructeur.where.missing(:instructeur).pluck(:instructeur_id) + AdministrateursInstructeur.where(instructeur_id: deleted_instructeurs_ids).delete_all + end + + add_foreign_key :administrateurs_instructeurs, :administrateurs + add_foreign_key :administrateurs_instructeurs, :instructeurs + end + + def down + remove_foreign_key :administrateurs_instructeurs, :administrateurs + remove_foreign_key :administrateurs_instructeurs, :instructeurs + end +end diff --git a/db/schema.rb b/db/schema.rb index 3ef845f12..eae315522 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.define(version: 2022_02_04_130722) do +ActiveRecord::Schema.define(version: 2022_03_02_101337) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -852,6 +852,8 @@ ActiveRecord::Schema.define(version: 2022_02_04_130722) do end add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" + add_foreign_key "administrateurs_instructeurs", "administrateurs" + add_foreign_key "administrateurs_instructeurs", "instructeurs" add_foreign_key "archives_groupe_instructeurs", "archives" add_foreign_key "archives_groupe_instructeurs", "groupe_instructeurs" add_foreign_key "assign_tos", "groupe_instructeurs" From 13dfa577bd34443a95f8e2e0acb137c73878097f Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 2 Mar 2022 14:09:43 +0100 Subject: [PATCH 3/3] db: add missing part of schema.rb --- db/schema.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/db/schema.rb b/db/schema.rb index eae315522..16c13c8d7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -854,6 +854,7 @@ ActiveRecord::Schema.define(version: 2022_03_02_101337) do add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "administrateurs_instructeurs", "administrateurs" add_foreign_key "administrateurs_instructeurs", "instructeurs" + add_foreign_key "administrateurs_procedures", "administrateurs" add_foreign_key "archives_groupe_instructeurs", "archives" add_foreign_key "archives_groupe_instructeurs", "groupe_instructeurs" add_foreign_key "assign_tos", "groupe_instructeurs"