2013-06-26 2 views
26

У меня есть приложение ruby ​​on rails, работающее нормально и подключенное к базе данных. Теперь я хочу подключиться к другой базе данных из того же приложения. Модель данных может быть точно такой же. На самом деле, если я подключаюсь к другой базе данных, приложение работает нормально. Однако я хочу подключиться к двум различным базам данных. Возможно ли в рубине на рельсах?Подключение к нескольким базам данных в ruby ​​on rails

+0

Возможный дубликат: http://stackoverflow.com/questions/6122508/connecting-rails-3-1-with-multiple-databases – voondo

+0

http://imnithin.github.io/multiple-database.html – Nithin

ответ

15

Использование establish_connection для переключения на другую базу данных:

ActiveRecord::Base.establish_connection(
    :adapter => "mysql", 
    :host  => "localhost", 
    :username => "myuser", 
    :password => "mypass", 
    :database => "somedatabase" 
) 

Вы также можете передать предварительно сконфигурированный среду от database.yml так:

ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['other_env']) 

Вы также можете установить его для конкретной модели :

MyClass.establish_connection(...) 
+1

Thank вы! Для подключения к отдельной базе данных за пределами активного класса записи требуется «ActiveRecord :: Base.configurations ['other_env']', в противном случае она фактически не загружает конфигурацию. – KPheasey

67

Для подключения нескольких баз данных необходимо добавить fo llowing коды в файл database.yml. Здесь я привожу пример соединения двух баз данных из приложения рельсов

конфигурации/database.yml

development: 
    adapter: mysql2 
    database: db1_dev 
    username: root 
    password: xyz 
    host: localhost 

development_sec: 
    adapter: mysql2 
    database: db2_dev 
    username: root 
    password: xyz 
    host: localhost 

production: 
    adapter: mysql2 
    database: db1_prod 
    username: root 
    password: xyz 
    host: your-production-ip 

production_sec: 
    adapter: mysql2 
    database: db2_prod 
    username: root 
    password: xyz 
    host: your-production-ip 

Здесь я использовал две базы данных для среды разработки и производства.

Теперь нам нужно подключить модель к базам данных. Когда вы запускаете свое приложение в режиме разработки и производства, все модели будут отображаться с помощью параметров разработки и производства db, упомянутых в вашей базе данных.yml. Поэтому для некоторой модели нам нужно подключиться к другой базе данных.

Предположим, что у нас есть две модели пользователя и категории. Таблица пользователей находится в db1_dev и db1_prod, таблице категорий в db2_dev и db2_prod.

Категория модель

class Category < ActiveRecord::Base 
    establish_connection "#{Rails.env}_sec" 
end 

Аналогично, при добавлении новой миграции во второй базе данных, необходимо добавить следующий код к нему.

class CreateRewards < ActiveRecord::Migration 
    def connection 
    ActiveRecord::Base.establish_connection("#{Rails.env}_sec").connection 
    end 

    def change 
    # your code goes here. 
    end 
end 

Надеюсь, что это сработает для вас :).

+0

Действительно, так я решил проблему. – ringe

+1

On Rails 5.1 Мне пришлось символизировать имя соединения. 'установить_соединение '# {Rails.env} _sec" .to_sym' – delphaber