В rails 3.2 добавление метода подключения к вашей миграции НЕ работает. Так что все ответы вроде
def connection
@connection ||= ActiveRecord::Base.establish_connection
end
просто не будет работать (не может down
, не работает с change
, потеря соединения и т. Д.). Причина этого в том, что классы ActiveRecord :: Migration и Migrator имеют жестко запрограммированные соединения в ActiveRecord :: Base all over место .
К счастью этот пост указал мне на этот билет , который имеет хорошее решение, а именно, переопределение фактической задачи рейка .
В итоге я использовал немного другую задачу rake, чтобы я мог быть более конкретным в отношении миграций, которые я запускаю на другой базе данных (мы пытались поддерживать несколько версий БД):
Вот моя библиотека lib / task / database.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
Это позволяет нам поместить миграции, специфичные для одной базы данных, в их собственный подкаталог (nine_four / migrations вместо db / migrations). Это также дает каждой базе данных полную изоляцию с точки зрения их схемы и версий миграции. Единственный недостаток - запуск двух задач rake (db: migrate и nine_four: db: migrate).