Skip to content

Commit 53d5469

Browse files
authored
Merge pull request rails#42651 from eileencodes/fix-migrations-with-same-timestamp-in-multiple-databases
Fix migrations with the same timestamps in multiple databases
2 parents bead322 + 22cef24 commit 53d5469

File tree

3 files changed

+43
-5
lines changed

3 files changed

+43
-5
lines changed

activerecord/lib/active_record/railties/databases.rake

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ db_namespace = namespace :db do
9494
original_db_config = ActiveRecord::Base.connection_db_config
9595
mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions(db_configs)
9696

97-
mapped_versions.sort.each do |version, db_config|
98-
ActiveRecord::Base.establish_connection(db_config)
99-
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
97+
mapped_versions.sort.each do |version, db_configs|
98+
db_configs.each do |db_config|
99+
ActiveRecord::Base.establish_connection(db_config)
100+
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
101+
end
100102
end
101103
end
102104

activerecord/lib/active_record/tasks/database_tasks.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ def migrate(version = nil)
286286
end
287287

288288
def db_configs_with_versions(db_configs) # :nodoc:
289-
db_configs_with_versions = {}
289+
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
290290

291291
db_configs.each do |db_config|
292292
ActiveRecord::Base.establish_connection(db_config)
@@ -295,7 +295,7 @@ def db_configs_with_versions(db_configs) # :nodoc:
295295

296296
versions_to_run.each do |version|
297297
next if target_version && target_version != version
298-
db_configs_with_versions[version] = db_config
298+
db_configs_with_versions[version] << db_config
299299
end
300300
end
301301

railties/test/application/rake/multi_dbs_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,42 @@ class ThreeMigration < ActiveRecord::Migration::Current
451451
end
452452
end
453453

454+
test "migrations in different directories can have the same timestamp" do
455+
require "#{app_path}/config/environment"
456+
app_file "db/migrate/01_one_migration.rb", <<-MIGRATION
457+
class OneMigration < ActiveRecord::Migration::Current
458+
def change
459+
create_table :posts do |t|
460+
t.string :title
461+
462+
t.timestamps
463+
end
464+
end
465+
end
466+
MIGRATION
467+
468+
app_file "db/animals_migrate/01_one_migration.rb", <<-MIGRATION
469+
class OneMigration < ActiveRecord::Migration::Current
470+
def change
471+
create_table :dogs do |t|
472+
t.string :name
473+
474+
t.timestamps
475+
end
476+
end
477+
end
478+
MIGRATION
479+
480+
Dir.chdir(app_path) do
481+
output = rails "db:migrate"
482+
entries = output.scan(/^== (\d+).+migrated/).map(&:first).map(&:to_i)
483+
484+
assert_match(/dogs/, output)
485+
assert_match(/posts/, output)
486+
assert_equal [1, 1], entries
487+
end
488+
end
489+
454490
test "db:migrate and db:schema:dump and db:schema:load works on all databases" do
455491
db_migrate_and_schema_dump_and_load
456492
end

0 commit comments

Comments
 (0)