Ответ прост: из базы данных.
Кстати - когда вы посмотрите на исходный код db: * tasks (... / activerecord / railties / database.rake) выможно увидеть, что задачи миграции вызывают схему: dump после запуска
desc "Migrate the database (options: VERSION=x, VERBOSE=false)."
task :migrate => :environment do
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end
Таким образом, миграция работает так, как она меняет базу данных и , а затем генерирует файл schema.rb.