Мне нужно использовать разные подключения к базам данных в разных моделях Rails. Есть ли не так хакерский способ сделать это?
Любые ссылки или ключевые слова для поиска были бы замечательными:)
Мне нужно использовать разные подключения к базам данных в разных моделях Rails. Есть ли не так хакерский способ сделать это?
Любые ссылки или ключевые слова для поиска были бы замечательными:)
mikej прав. Однако я написал камень, который заставляет код модели подключаться немного чище, проверить его.
Добавьте новые разделы в 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
Я использовал следующее, чтобы подключиться к 2 db в одном приложении. Я помещаю их в папку 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
Надеюсь, что поможет
Обновление для Rails 3.x:
class MyModel < ActiveRecord::Base
establish_connection "other_#{Rails.env}"
end
Я думаю, что самый лучший способ подключиться к другой базе данных с активной моделью - это создать базовый класс для внешней базы данных, а затем наследовать от этой базы в вашей модели. Этот метод отлично работает с рельсами 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
В рельсах 4.1+ establish_connection
теперь берется символ:
class OtherDbModel < ActiveRecord::Base
establish_connection :"other_#{Rails.env}"
end