Как использовать несколько баз данных для одного приложения rails 3.1 в Heroku? - PullRequest
13 голосов
/ 06 октября 2011

Приложение My Rails 3.1 подключается к 2 базам данных, одна из которых используется по умолчанию, а другая - экземпляр Amazon RDS MYSQL.

Текущий файл database.yml содержит два соединения с производственной базой данных. Модели, которые нужно извлечь из второй базы данных, просто используют

establish_connection "production_on_amazon"

К сожалению, Heroku перезаписывает ваш database.yml и, кажется, включает только одно соединение с базой данных. Кто-нибудь знает, как я могу добавить или настроить свой второй?

Запуск "heroku config" Я вижу, что в списке есть 2 БД, но, похоже, не могу настроить подключение к обоим. Возможно, каким-то образом установите мое значение по умолчанию для базы данных SHARED_DATABASE_URL на Heroku и установите альтернативу DATABASE_URL, которая указывает на Amazon ...

Ответы [ 3 ]

7 голосов
/ 17 апреля 2012

Отработка предыдущих ответов, но включение некоторых преимуществ 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
2 голосов
/ 17 февраля 2012

Что касается ответа Нейла, вот способ сделать это.Не оригинальное решение, но может дать вам представление ... /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 голосов
/ 12 октября 2011

Heroku всегда подключит ваше приложение к производственной БД, которую они для вас создадут.Если вы хотите создать дополнительное соединение, вам нужно сделать это вручную в своем коде и создать переменную ENV, которую код может использовать в качестве строки соединения.

Все, что находится в производственном сегменте database.ymlзагружен Heroku и заменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...