From a645c5781d01f22c020bccfaa2090a40f5b703a5 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 2 Mar 2022 12:09:35 +0100 Subject: [PATCH 1/7] models: delete AdministrateursProcedure when destroying Procedure --- app/models/procedure.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/procedure.rb b/app/models/procedure.rb index d3be28e47..a7cc0e1a9 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -176,7 +176,7 @@ class Procedure < ApplicationRecord end end - has_many :administrateurs_procedures + has_many :administrateurs_procedures, dependent: :delete_all has_many :administrateurs, through: :administrateurs_procedures, after_remove: -> (procedure, _admin) { procedure.validate! } has_many :groupe_instructeurs, dependent: :destroy has_many :instructeurs, through: :groupe_instructeurs From 3a16235868fb113905786435852bc0911252bee7 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Tue, 8 Mar 2022 13:47:27 +0000 Subject: [PATCH 2/7] db: Add a `delete_orphans` db helper --- app/lib/database/migration_helpers.rb | 30 ++- spec/lib/database/migration_helpers_spec.rb | 238 ++++++++++++++------ 2 files changed, 200 insertions(+), 68 deletions(-) diff --git a/app/lib/database/migration_helpers.rb b/app/lib/database/migration_helpers.rb index 07061d888..e0a224d83 100644 --- a/app/lib/database/migration_helpers.rb +++ b/app/lib/database/migration_helpers.rb @@ -1,4 +1,4 @@ -# Some of this file is lifted from Gitlab's `lib/gitlab/database/migration_helpers.rb`` +# Some of this file is lifted from Gitlab's `lib/gitlab/database/migration_helpers.rb` # Copyright (c) 2011-present GitLab B.V. # @@ -103,6 +103,34 @@ module Database::MigrationHelpers end end + # Delete records from `from_table` having a reference to a missing record in `to_table`. + # This is useful to rectify data before adding a proper foreign_key. + # + # Example: + # + # delete_orphans :appointments, :physicians + # + def delete_orphans(from_table, to_table) + say_with_time "Deleting records from #{from_table} where the associated #{to_table.to_s.singularize} no longer exists" do + from_table = Arel::Table.new(from_table) + to_table = Arel::Table.new(to_table) + foreign_key_column = foreign_key_column_for(to_table.name) + + # Select the ids of orphan records + arel_select = from_table + .join(to_table, Arel::Nodes::OuterJoin).on(to_table[:id].eq(from_table[foreign_key_column])) + .where(to_table[:id].eq(nil)) + .project(from_table[foreign_key_column]) + missing_record_ids = query_values(arel_select.to_sql) + + # Delete the records having ids referencing missing data + arel_delete = Arel::DeleteManager.new() + .from(from_table) + .where(from_table[foreign_key_column].in(missing_record_ids.uniq)) + exec_delete(arel_delete.to_sql) + end + end + private def statement_timeout_disabled? diff --git a/spec/lib/database/migration_helpers_spec.rb b/spec/lib/database/migration_helpers_spec.rb index 4fab02099..1ca896cfb 100644 --- a/spec/lib/database/migration_helpers_spec.rb +++ b/spec/lib/database/migration_helpers_spec.rb @@ -1,90 +1,194 @@ describe Database::MigrationHelpers do - class TestLabel < ApplicationRecord - end + describe 'handling duplicates' do + class TestLabel < ApplicationRecord + end - before(:all) do - ActiveRecord::Migration.suppress_messages do - ActiveRecord::Migration.create_table "test_labels", force: true do |t| - t.string :label - t.integer :user_id + before(:all) do + ActiveRecord::Migration.suppress_messages do + ActiveRecord::Migration.create_table "test_labels", force: true do |t| + t.string :label + t.integer :user_id + end + ActiveRecord::Migration.create_table "test_labels", force: true do |t| + t.string :label + t.integer :user_id + end end end - end - before(:each) do - # User 1 labels - TestLabel.create({ id: 1, label: 'Important', user_id: 1 }) - TestLabel.create({ id: 2, label: 'Urgent', user_id: 1 }) - TestLabel.create({ id: 3, label: 'Done', user_id: 1 }) - TestLabel.create({ id: 4, label: 'Bug', user_id: 1 }) + before(:each) do + # User 1 labels + TestLabel.create({ id: 1, label: 'Important', user_id: 1 }) + TestLabel.create({ id: 2, label: 'Urgent', user_id: 1 }) + TestLabel.create({ id: 3, label: 'Done', user_id: 1 }) + TestLabel.create({ id: 4, label: 'Bug', user_id: 1 }) - # User 2 labels - TestLabel.create({ id: 5, label: 'Important', user_id: 2 }) - TestLabel.create({ id: 6, label: 'Critical', user_id: 2 }) + # User 2 labels + TestLabel.create({ id: 5, label: 'Important', user_id: 2 }) + TestLabel.create({ id: 6, label: 'Critical', user_id: 2 }) - # Duplicates - TestLabel.create({ id: 7, label: 'Urgent', user_id: 1 }) - TestLabel.create({ id: 8, label: 'Important', user_id: 2 }) - end - - after(:all) do - ActiveRecord::Migration.suppress_messages do - ActiveRecord::Migration.drop_table :test_labels, force: true + # Duplicates + TestLabel.create({ id: 7, label: 'Urgent', user_id: 1 }) + TestLabel.create({ id: 8, label: 'Important', user_id: 2 }) end - end - let(:model) { ActiveRecord::Migration.new.extend(Database::MigrationHelpers) } + after(:all) do + ActiveRecord::Migration.suppress_messages do + ActiveRecord::Migration.drop_table :test_labels, force: true + end + end - describe '.find_duplicates' do - context 'using a single column for uniqueness' do + let(:model) { ActiveRecord::Migration.new.extend(Database::MigrationHelpers) } + + describe '.find_duplicates' do + context 'using a single column for uniqueness' do + subject do + model.find_duplicates(:test_labels, [:label]) + end + + it 'finds duplicates' do + expect(subject.length).to eq 2 + end + + it 'finds three labels with "Important"' do + expect(subject).to include [1, 5, 8] + end + + it 'finds two labels with "Urgent"' do + expect(subject).to include [2, 7] + end + end + + context 'using multiple columns for uniqueness' do + subject do + model.find_duplicates(:test_labels, [:label, :user_id]) + end + + it 'finds duplicates' do + expect(subject.length).to eq 2 + end + + it 'finds two labels with "Important" for user 2' do + expect(subject).to include [5, 8] + end + + it 'finds two labels with "Urgent" for user 1' do + expect(subject).to include [2, 7] + end + end + end + + describe '.delete_duplicates' do subject do - model.find_duplicates(:test_labels, [:label]) + model.delete_duplicates(:test_labels, [:label]) end - it 'finds duplicates' do - expect(subject.length).to eq 2 - end - - it 'finds three labels with "Important"' do - expect(subject).to include [1, 5, 8] - end - - it 'finds two labels with "Urgent"' do - expect(subject).to include [2, 7] - end - end - - context 'using multiple columns for uniqueness' do - subject do - model.find_duplicates(:test_labels, [:label, :user_id]) - end - - it 'finds duplicates' do - expect(subject.length).to eq 2 - end - - it 'finds two labels with "Important" for user 2' do - expect(subject).to include [5, 8] - end - - it 'finds two labels with "Urgent" for user 1' do - expect(subject).to include [2, 7] + it 'keeps the first item, and delete the others' do + expect { subject }.to change(TestLabel, :count).by(-3) + expect(TestLabel.where(label: 'Critical').count).to eq(1) + expect(TestLabel.where(label: 'Important').count).to eq(1) + expect(TestLabel.where(label: 'Urgent').count).to eq(1) + expect(TestLabel.where(label: 'Bug').count).to eq(1) + expect(TestLabel.where(label: 'Done').count).to eq(1) end end end - describe '.delete_duplicates' do + describe '.delete_orphans' do + class TestPhysician < ApplicationRecord; end + + class TestPatient < ApplicationRecord; end + + class TestAppointment < ApplicationRecord; end + + before(:all) do + ActiveRecord::Migration.suppress_messages do + ActiveRecord::Migration.create_table "test_physicians", force: true do |t| + t.string :name + end + ActiveRecord::Migration.create_table "test_patients", force: true do |t| + t.string :name + end + ActiveRecord::Migration.create_table "test_appointments", id: false, force: true do |t| + t.integer :test_physician_id + t.integer :test_patient_id + t.datetime :datetime + end + end + end + + after(:all) do + ActiveRecord::Migration.suppress_messages do + ActiveRecord::Migration.drop_table :test_physicians, force: true + ActiveRecord::Migration.drop_table :test_patients, force: true + ActiveRecord::Migration.drop_table :test_appointments, force: true + end + end + + let(:model) { ActiveRecord::Migration.new.extend(Database::MigrationHelpers) } + subject do - model.delete_duplicates(:test_labels, [:label]) + model.delete_orphans(:test_appointments, :test_patients) end - it 'keeps the first item, and delete the others' do - expect { subject }.to change(TestLabel, :count).by(-3) - expect(TestLabel.where(label: 'Critical').count).to eq(1) - expect(TestLabel.where(label: 'Important').count).to eq(1) - expect(TestLabel.where(label: 'Urgent').count).to eq(1) - expect(TestLabel.where(label: 'Bug').count).to eq(1) - expect(TestLabel.where(label: 'Done').count).to eq(1) + context 'when there are orphan records' do + before(:each) do + phy1 = TestPhysician.create({ name: 'Ibn Sina' }) + phy2 = TestPhysician.create({ name: 'Louis Pasteur' }) + pa1 = TestPatient.create({ name: 'Chams ad-Dawla' }) + pa2 = TestPatient.create({ name: 'Joseph Meister' }) + ap1 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: pa1.id, datetime: 2.months.ago }) + ap2 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: pa1.id, datetime: 1.month.ago }) + ap3 = TestAppointment.create({ test_physician_id: phy2.id, test_patient_id: pa2.id, datetime: 2.days.ago }) + ap4 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: pa2.id, datetime: 1.day.ago }) + ap5 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: pa1.id, datetime: Time.zone.today }) + + # Appointments missing the associated patient + ap6 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: 9999, datetime: 3.months.ago }) + ap7 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: 8888, datetime: 2.months.ago }) + ap8 = TestAppointment.create({ test_physician_id: phy2.id, test_patient_id: 8888, datetime: 1.month.ago }) + + # Appointments missing the associated physician + ap9 = TestAppointment.create({ test_physician_id: 7777, test_patient_id: pa1.id, datetime: 3.months.ago }) + end + + it 'deletes orphaned records on the specified key' do + expect { subject }.to change { TestAppointment.count }.by(-3) + + # rubocop:disable Rails/WhereEquals + appointments_with_missing_patients = TestAppointment + .joins('LEFT OUTER JOIN test_patients ON test_patients.id = test_appointments.test_patient_id') + .where('test_patients.id IS NULL') + # rubocop:enable Rails/WhereEquals + expect(appointments_with_missing_patients.count).to eq(0) + end + + it 'keeps orphaned records on another key' do + subject + + # rubocop:disable Rails/WhereEquals + appointments_with_missing_physicians = TestAppointment + .joins('LEFT OUTER JOIN test_physicians ON test_physicians.id = test_appointments.test_physician_id') + .where('test_physicians.id IS NULL') + # rubocop:enable Rails/WhereEquals + expect(appointments_with_missing_physicians.count).not_to eq(0) + end + + it 'keeps valid associated records' do + expect { subject }.not_to change { [TestPhysician.count, TestPatient.count] } + end + end + + context 'when there are no orphaned records' do + before(:each) do + phy1 = TestPhysician.create({ name: 'Ibn Sina' }) + pa1 = TestPatient.create({ name: 'Chams ad-Dawla' }) + ap1 = TestAppointment.create({ test_physician_id: phy1.id, test_patient_id: pa1.id, datetime: 2.months.ago }) + end + + it 'doesn’t remove any records' do + expect { subject }.not_to change { [TestPhysician.count, TestPatient.count, TestAppointment.count] } + end end end From a4108c778747c751f947eab13218187b3f9633c5 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Tue, 8 Mar 2022 14:47:06 +0100 Subject: [PATCH 3/7] db: backport `delete_orphans` in recent migrations Recent migrations used ActiveRecord when removing invalid data. This may break if the ActiveRecord model later changes. To ensure these migrations will run correctly, even when the code will have changed, let's use an SQL-based helper instead of ActiveRecord. --- ...r_foreign_key_to_administrateurs_procedure.rb | 11 ++++------- ...reign_keys_to_administrateurs_instructeurs.rb | 16 +++++----------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/db/migrate/20220301160753_add_administrateur_foreign_key_to_administrateurs_procedure.rb b/db/migrate/20220301160753_add_administrateur_foreign_key_to_administrateurs_procedure.rb index d8d0bbb0a..944940df1 100644 --- a/db/migrate/20220301160753_add_administrateur_foreign_key_to_administrateurs_procedure.rb +++ b/db/migrate/20220301160753_add_administrateur_foreign_key_to_administrateurs_procedure.rb @@ -1,12 +1,9 @@ class AddAdministrateurForeignKeyToAdministrateursProcedure < ActiveRecord::Migration[6.1] - def up - # Sanity check - say_with_time 'Removing AdministrateursProcedures where the associated Administrateur no longer exists ' do - deleted_administrateur_ids = AdministrateursProcedure.where.missing(:administrateur).pluck(:administrateur_id) - AdministrateursProcedure.where(administrateur_id: deleted_administrateur_ids).delete_all - end + include Database::MigrationHelpers - add_foreign_key :administrateurs_procedures, :administrateurs + def up + delete_orphans :administrateurs_procedures, :administrateurs_procedures + add_foreign_key :administrateurs_procedures, :administrateurs_procedures end def down diff --git a/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb b/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb index fc524565f..ae863654d 100644 --- a/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb +++ b/db/migrate/20220302101337_add_foreign_keys_to_administrateurs_instructeurs.rb @@ -1,17 +1,11 @@ class AddForeignKeysToAdministrateursInstructeurs < ActiveRecord::Migration[6.1] + include Database::MigrationHelpers + 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 - + delete_orphans :administrateurs_instructeurs, :administrateurs add_foreign_key :administrateurs_instructeurs, :administrateurs + + delete_orphans :administrateurs_instructeurs, :instructeurs add_foreign_key :administrateurs_instructeurs, :instructeurs end From 27edc6676dc16827511705938a1a9ccaf998520b Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Tue, 8 Mar 2022 08:21:22 +0000 Subject: [PATCH 4/7] db: add foreign key contraint to AdministrateursProcedure In production there are around 20 000 AdministrateursProcedure records that reference a deleted Procedure. --- ...edure_foreign_key_to_administrateurs_procedure.rb | 12 ++++++++++++ db/schema.rb | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220308110720_add_procedure_foreign_key_to_administrateurs_procedure.rb diff --git a/db/migrate/20220308110720_add_procedure_foreign_key_to_administrateurs_procedure.rb b/db/migrate/20220308110720_add_procedure_foreign_key_to_administrateurs_procedure.rb new file mode 100644 index 000000000..2b6fc5304 --- /dev/null +++ b/db/migrate/20220308110720_add_procedure_foreign_key_to_administrateurs_procedure.rb @@ -0,0 +1,12 @@ +class AddProcedureForeignKeyToAdministrateursProcedure < ActiveRecord::Migration[6.1] + include Database::MigrationHelpers + + def up + delete_orphans :administrateurs_procedures, :procedures + add_foreign_key :administrateurs_procedures, :procedures + end + + def down + remove_foreign_key :administrateurs_procedures, :procedures + end +end diff --git a/db/schema.rb b/db/schema.rb index 16c13c8d7..3e2d4a1f7 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_03_02_101337) do +ActiveRecord::Schema.define(version: 2022_03_08_110720) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -855,6 +855,7 @@ ActiveRecord::Schema.define(version: 2022_03_02_101337) do add_foreign_key "administrateurs_instructeurs", "administrateurs" add_foreign_key "administrateurs_instructeurs", "instructeurs" add_foreign_key "administrateurs_procedures", "administrateurs" + add_foreign_key "administrateurs_procedures", "procedures" add_foreign_key "archives_groupe_instructeurs", "archives" add_foreign_key "archives_groupe_instructeurs", "groupe_instructeurs" add_foreign_key "assign_tos", "groupe_instructeurs" From feeb8b691a6b99363f55a7cbbb9e67922f4f6154 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 9 Mar 2022 10:32:29 +0100 Subject: [PATCH 5/7] bump rails to 6.1.4.7 --- Gemfile.lock | 108 +++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 08472eebd..1a9ba160c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,40 +4,40 @@ GEM aasm (5.2.0) concurrent-ruby (~> 1.0) acsv (0.0.1) - actioncable (6.1.4.6) - actionpack (= 6.1.4.6) - activesupport (= 6.1.4.6) + actioncable (6.1.4.7) + actionpack (= 6.1.4.7) + activesupport (= 6.1.4.7) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.4.6) - actionpack (= 6.1.4.6) - activejob (= 6.1.4.6) - activerecord (= 6.1.4.6) - activestorage (= 6.1.4.6) - activesupport (= 6.1.4.6) + actionmailbox (6.1.4.7) + actionpack (= 6.1.4.7) + activejob (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) mail (>= 2.7.1) - actionmailer (6.1.4.6) - actionpack (= 6.1.4.6) - actionview (= 6.1.4.6) - activejob (= 6.1.4.6) - activesupport (= 6.1.4.6) + actionmailer (6.1.4.7) + actionpack (= 6.1.4.7) + actionview (= 6.1.4.7) + activejob (= 6.1.4.7) + activesupport (= 6.1.4.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.4.6) - actionview (= 6.1.4.6) - activesupport (= 6.1.4.6) + actionpack (6.1.4.7) + actionview (= 6.1.4.7) + activesupport (= 6.1.4.7) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.4.6) - actionpack (= 6.1.4.6) - activerecord (= 6.1.4.6) - activestorage (= 6.1.4.6) - activesupport (= 6.1.4.6) + actiontext (6.1.4.7) + actionpack (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) nokogiri (>= 1.8.5) - actionview (6.1.4.6) - activesupport (= 6.1.4.6) + actionview (6.1.4.7) + activesupport (= 6.1.4.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -55,26 +55,26 @@ GEM activemodel (>= 5.2.0) activestorage (>= 5.2.0) activesupport (>= 5.2.0) - activejob (6.1.4.6) - activesupport (= 6.1.4.6) + activejob (6.1.4.7) + activesupport (= 6.1.4.7) globalid (>= 0.3.6) - activemodel (6.1.4.6) - activesupport (= 6.1.4.6) - activerecord (6.1.4.6) - activemodel (= 6.1.4.6) - activesupport (= 6.1.4.6) - activestorage (6.1.4.6) - actionpack (= 6.1.4.6) - activejob (= 6.1.4.6) - activerecord (= 6.1.4.6) - activesupport (= 6.1.4.6) + activemodel (6.1.4.7) + activesupport (= 6.1.4.7) + activerecord (6.1.4.7) + activemodel (= 6.1.4.7) + activesupport (= 6.1.4.7) + activestorage (6.1.4.7) + actionpack (= 6.1.4.7) + activejob (= 6.1.4.7) + activerecord (= 6.1.4.7) + activesupport (= 6.1.4.7) marcel (~> 1.0.0) mini_mime (>= 1.1.0) activestorage-openstack (1.5.1) fog-openstack (~> 1.0) marcel rails (>= 5.2.2) - activesupport (6.1.4.6) + activesupport (6.1.4.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -502,20 +502,20 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.1.4.6) - actioncable (= 6.1.4.6) - actionmailbox (= 6.1.4.6) - actionmailer (= 6.1.4.6) - actionpack (= 6.1.4.6) - actiontext (= 6.1.4.6) - actionview (= 6.1.4.6) - activejob (= 6.1.4.6) - activemodel (= 6.1.4.6) - activerecord (= 6.1.4.6) - activestorage (= 6.1.4.6) - activesupport (= 6.1.4.6) + rails (6.1.4.7) + actioncable (= 6.1.4.7) + actionmailbox (= 6.1.4.7) + actionmailer (= 6.1.4.7) + actionpack (= 6.1.4.7) + actiontext (= 6.1.4.7) + actionview (= 6.1.4.7) + activejob (= 6.1.4.7) + activemodel (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) bundler (>= 1.15.0) - railties (= 6.1.4.6) + railties (= 6.1.4.7) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -534,9 +534,9 @@ GEM rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.1.4.6) - actionpack (= 6.1.4.6) - activesupport (= 6.1.4.6) + railties (6.1.4.7) + actionpack (= 6.1.4.7) + activesupport (= 6.1.4.7) method_source rake (>= 0.13) thor (~> 1.0) @@ -684,7 +684,7 @@ GEM spring (2.1.1) spring-commands-rspec (1.0.4) spring (>= 0.9.1) - sprockets (4.0.2) + sprockets (4.0.3) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.4.2) From bcbcd11c425e2b1307759080c03603d7a8889414 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 9 Mar 2022 11:32:22 +0100 Subject: [PATCH 6/7] migrate(dossier): fill hidden_by_administration_at and hidden_by_user_at from hidden_at --- .../20220309101504_seed_hidden_at_dossiers.rake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake diff --git a/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake b/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake new file mode 100644 index 000000000..4d12f3e26 --- /dev/null +++ b/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake @@ -0,0 +1,16 @@ +namespace :after_party do + desc 'Deployment task: seed_hidden_at_dossiers' + task seed_hidden_at_dossiers: :environment do + puts "Running deploy task 'seed_hidden_at_dossiers'" + + Dossier + .where.not(hidden_at: nil) + .where(hidden_by_user_at: nil, hidden_by_administration_at: nil) + .update_all('hidden_by_user_at = hidden_at, hidden_by_administration_at = hidden_at') + + # Update task as completed. If you remove the line below, the task will + # run with every deploy (or every time you call after_party:run). + AfterParty::TaskRecord + .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp + end +end From 4c567632e5eacbd5e1ffd21d2f5f1c5c96c94205 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 9 Mar 2022 17:53:49 +0100 Subject: [PATCH 7/7] fix(migration): add with_discarded to seed_hidden_at_dossiers --- lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake b/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake index 4d12f3e26..ffdb19e0d 100644 --- a/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake +++ b/lib/tasks/deployment/20220309101504_seed_hidden_at_dossiers.rake @@ -4,6 +4,7 @@ namespace :after_party do puts "Running deploy task 'seed_hidden_at_dossiers'" Dossier + .with_discarded .where.not(hidden_at: nil) .where(hidden_by_user_at: nil, hidden_by_administration_at: nil) .update_all('hidden_by_user_at = hidden_at, hidden_by_administration_at = hidden_at')