Как мне работать с двумя разными базами данных в рельсах с активными записями? - PullRequest
43 голосов
/ 04 августа 2009

Мне нужно использовать разные соединения с базой данных в разных моделях Rails. Есть ли не такой хакерский способ сделать это?

Любые ссылки или ключевые слова для поиска были бы хороши:)

Ответы [ 6 ]

114 голосов
/ 04 августа 2009

Добавить новые разделы в database.yml, например,

other_development:
  adapter: mysql
  database: otherdb_development
  username: root
  password:
  host: localhost

other_production:
  adapter: mysql
  database: otherdb_production
  username: root
  password:
  host: localhost

Добавить класс в lib/other_database.rb

class OtherDatabase < ActiveRecord::Base
  establish_connection "other_#{RAILS_ENV}"
end

и затем для каждой модели, которая не входит в подкласс базы данных по умолчанию с OtherDatabase например:

class MyModel < OtherDatabase
   # my model code...
end
13 голосов
/ 21 августа 2009

Я использовал следующее для подключения к 2 дБ в том же приложении. Я положил их в папку lib, так как там все загружено.

require 'active_record'

class OldDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(
  :adapter  => 'mysql',
  :database => 'weather',
  :host     => 'localhost',
  :username => 'root',
  :password => 'password'
  )
end

class NewDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(
  :adapter  => 'mysql',
  :database => 'redmine',
  :host     => 'localhost',
  :username => 'root',
  :password => 'password'
  )
end

class WeatherData < OldDatabase
end

class Board < NewDatabase
end

Надеюсь, что поможет

10 голосов
/ 05 августа 2009

mikej прав. Я, однако, написал гем, который делает код модели для подключения немного чище, проверить его .

9 голосов
/ 09 марта 2013

Обновление для Rails 3.x:

class MyModel < ActiveRecord::Base
  establish_connection "other_#{Rails.env}"
end
1 голос
/ 08 июля 2017

Я думаю, что самый красивый способ подключения к другой базе данных с активной моделью - создать базовый класс для внешней базы данных, а затем наследовать эту базу в вашей модели. Этот метод отлично работает с рельсами 4.2.6 и 5.0.4

Например:

# in /models/external_db/base.rb
require 'active_record'

class ExternalDb::Base < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "external_db_#{Rails.env}".to_sym
end

А в вашей модели класс:

# in /models/external_db/some_model.rb
class ExternalDB::SomeModel < ExternalDb::Base
  # your code
end

Но вы должны определить внешнюю базу данных в /config/database.yml

# in /config/database.yml
external_db_development:
  adapter: sqlite3
  pool: 5
  timeout: 5000
  database: db/external_db_development.db

external_db_production:
  adapter: sqlite3
  pool: 5
  timeout: 5000
  database: db/external_db_production.db
0 голосов
/ 06 октября 2016

В рельсах 4.1+ establish_connection теперь принимает символ:

class OtherDbModel < ActiveRecord::Base
  establish_connection :"other_#{Rails.env}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...