Я получил эту работу, создав отдельные классы коннекторов для разных баз данных и используя их в миграциях.
class AddExampleToTest < ActiveRecord::Migration
def connection
@connection = OtherDatabaseConnector.establish_connection("sdmstore_#{Rails.env}").connection
end
def up
add_column :test, :example, :boolean, :default => true
@connection = MainDatabaseConnector.establish_connection("#{Rails.env}").connection
end
def down
remove_column :test, :example
@connection = MainDatabaseConnector.establish_connection("#{Rails.env}").connection
end
end
Мы можем определить эти классы соединителей в инициализаторах.
class MainDatabaseConnector < ActiveRecord::Base
end
class OtherDatabaseConnector < ActiveRecord::Base
end
ActiveRecord :: Base поддерживает пул соединений, который является хешем, проиндексированным классом. Подробнее здесь . Поэтому использование отдельных классов для отдельных соединений защищает нас от ошибки закрытого соединения.
Кроме того, использование up
и down
вместо change
позволяет откатить миграцию без каких-либо проблем. До сих пор не выяснил причину этого.