Как использовать несколько баз данных для одного приложения rails 3.1 в Heroku?
Приложение My Rails 3.1 подключается к 2 базам данных, по умолчанию используется один, другой - экземпляр Amazon RDS MYSQL.
В текущем database.yml содержатся два подключения к производственной базе данных. Модели, которые нужно извлечь из второй базы данных, просто используют
establish_connection "production_on_amazon"
К сожалению, Heroku перезаписывает ваш database.yml и только кажется, что он подключается к одному соединению с базой данных. Кто-нибудь знает, как я могу добавить или настроить вторую?
Запуск "конфигурации героя". Я вижу, что есть 2 БД, но, возможно, не настроены для подключения к обоим. Возможно, каким-то образом я установил свой дефолт на SHARED_DATABASE_URL db на Heroku и установил альтернативу DATABASE_URL, который указывает на Amazon...
Ответы
Ответ 1
Относительно ответа Нила, вот способ сделать это. Не готовое решение, но может дать вам идею...
/lib/active _record_extensions.rb
module ActiveRecordExtensions
class Shard < ActiveRecord::Base
#need to switch to the shard database connection from heroku config
primary_database_url = ENV['PRIMARY_DATABASE_URL']
if(!primary_database_url.nil?)
parsed_connection_string = primary_database_url.split("://")
adapter = parsed_connection_string[0]
parsed_connection_string = parsed_connection_string[1].split(":")
username = parsed_connection_string[0]
parsed_connection_string = parsed_connection_string[1].split("@")
password = parsed_connection_string[0]
parsed_connection_string = parsed_connection_string[1].split("/")
host = parsed_connection_string[0]
database = parsed_connection_string[1]
establish_connection(
:adapter => adapter,
:host => host,
:username => username,
:password => password,
:database => database,
:port => 3306,
:pool => 5,
:timeout => 5000
)
else
self.establish_connection "shard_#{Rails.env}"
end
end
class ShardMigration < ActiveRecord::Migration
def connection
ActiveRecord::Shard.connection
end
end
end
Итак, ваша модель должна просто расширить ActiveRecord:: Shard вместо Base
Ответ 2
Отработка предыдущих ответов, но включение некоторых преимуществ Rails 3 с конфигурацией и упрощение синтаксического анализа...
# config/application.rb
module MyApp
class Application < Rails::Application
... other configs
config.secondary_database_url = ENV['SECONDARY_DB_URL']
end
end
Мы можем переопределить это в разработке/тесте
# config/environments/development.rb
module MyApp
class Application < Rails::Application
... other configs
config.secondary_database_url = 'SOME_CONNECTION_STRING'
end
end
Теперь, чтобы настроить класс, у нас будут наследоваться наши модели...
# lib/active_record/secondary.rb
module ActiveRecord
class Secondary < ActiveRecord::Base
self.abstract_class = true
# prior to AR 3.2.1
url = URI.parse( MyApp::Application.config.secondary_database_url )
establish_connection(
:adapter => 'mysql',
:host => url.host,
:username => url.userinfo.split(':')[0],
:password => url.userinfo.split(':')[1],
:database => url.path[1..-1],
:port => url.port || 3306
)
# as of AR 3.2.1
establish_connection(MyApp::Application.config.secondary_database_url)
end
class SecondaryMigration < ActiveRecord::Migration
def connection
ActiveRecord::Secondary.connection
end
end
end
Ответ 3
Heroku всегда будет подключать ваше приложение к производственной БД, которую они создают для вас. Если вы хотите сделать дополнительное соединение, вам нужно будет сделать это в своем коде вручную и создать ENV var, который код может использовать в качестве строки подключения.
Все, что в производственном сегменте базы данных .yml связывается с Heroku и заменяется.