En los carriles 3.2, no es posible agregar un método de conexión a su migración. Así que todas las respuestas como
def connection
@connection ||= ActiveRecord::Base.establish_connection
end
simplemente no va a funcionar (no puede down
, no funciona con change
, pérdida de conexión, etc.) La razón de esto es que el ActiveRecord :: Migración y Migrator la clase tiene conexiones codificadas en ActiveRecord :: Base allovertheplace.
Afortunadamente this post me señaló this ticket que tiene una buena solución, a saber, anulando el actual rake task.
Terminé usando una tarea rastrillo ligeramente diferente para que pudiera ser específico acerca de las migraciones que se ejecutan en la base de datos diferente (estábamos tratando de soportar múltiples versiones db):
Aquí está mi lib/task/base de datos .rake
# Augment the main migration to migrate your engine, too.
task 'db:migrate', 'nine_four:db:migrate'
namespace :nine_four do
namespace :db do
desc 'Migrates the 9.4 database'
task :migrate => :environment do
with_engine_connection do
ActiveRecord::Migrator.migrate("#{File.dirname(__FILE__)}/../../nine_four/migrate", ENV['VERSION'].try(:to_i))
end
end
end
end
# Hack to temporarily connect AR::Base to your engine.
def with_engine_connection
original = ActiveRecord::Base.remove_connection
ActiveRecord::Base.establish_connection("#{ Rails.env }_nine_four")
yield
ensure
ActiveRecord::Base.establish_connection(original)
end
Esto nos permite colocar las migraciones específicas de una base de datos en su propio subdirectorio (nine_four/migraciones en lugar de db/migraciones). También da a cada base de datos aislamiento total en términos de sus versiones de esquema y migración. El único inconveniente es tener dos tareas de rake para ejecutar (db: migrate y nine_four: db: migrate).
Gracias, con una pequeña corrección: he cambiado requiere 'activerecord' para requerir 'active_record' – valk