Ответ 1
Рельсы по умолчанию не предназначены для архитектуры с несколькими базами данных, и в большинстве случаев это не имеет никакого смысла. Но да, вы можете использовать разные базы данных и подключения.
Вот некоторые ссылки:
Можно ли это сделать? В одном приложении, которое управляет многими проектами с помощью SQLite. Я хочу, чтобы у меня была другая база данных для каждого проекта, которым управляет мое приложение.. так много копий одноименно структурированной базы данных, но с разными данными в них. Я буду выбирать, какую копию использовать базу на params в URI.
Это сделано для 1. безопасности. Я новичок в этом программировании, и я не хочу, чтобы это произошло, потому что по какой-то причине во время работы над проектом другой получает повреждение.. 2. простая резервная копия и архив старых проектов
Рельсы по умолчанию не предназначены для архитектуры с несколькими базами данных, и в большинстве случаев это не имеет никакого смысла. Но да, вы можете использовать разные базы данных и подключения.
Вот некоторые ссылки:
Если вы можете контролировать и настраивать каждый экземпляр Rails, и вы можете позволить себе тратить ресурсы из-за того, что они находятся в режиме ожидания, сохраните некоторые проблемы и просто измените database.yml, чтобы изменить соединение с базой данных, используемое для каждого экземпляра. Если вас беспокоит производительность, этот подход не сократит его.
Для моделей, привязанных к одной уникальной таблице только на одной базе данных, вы можете вызвать connection_connection внутри модели:
establish_connection "database_name_#{RAILS_ENV}"
Как описано здесь: http://apidock.com/rails/ActiveRecord/Base/establish_connection/class
У вас будут некоторые модели, использующие таблицы из одной базы данных и других моделей, используя таблицы из других баз данных.
Если у вас одинаковые таблицы, общие для разных баз данных и разделяемые одной моделью, ActiveRecord вам не поможет. Еще в 2009 году мне это потребовалось в проекте, над которым я работал, используя Rails 2.3.8. У меня была база данных для каждого клиента, и я назвал базы данных с их идентификаторами. Поэтому я создал метод для изменения соединения внутри ApplicationController:
def change_database database_id = params[:company_id]
return if database_id.blank?
configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"
MultipleDatabaseModel.establish_connection configuration
end
И добавил этот метод как before_filter ко всем контроллерам:
before_filter :change_database
Итак, для каждого действия каждого контроллера, когда params [: company_id] определяется и задается, он изменит базу данных на правильную.
Чтобы обрабатывать миграции, я расширил ActiveRecord:: Migration с помощью метода, который ищет всех клиентов и выполняет итерацию блока с каждым ID:
class ActiveRecord::Migration
def self.using_databases *args
configuration = ActiveRecord::Base.connection.instance_eval { @config }
former_database = configuration[:database]
companies = args.blank? ? Company.all : Company.find(args)
companies.each do |company|
configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
ActiveRecord::Base.establish_connection configuration
yield self
end
configuration[:database] = former_database
ActiveRecord::Base.establish_connection configuration
end
end
Обратите внимание, что, делая это, было бы невозможно сделать запросы в рамках одного действия из двух разных баз данных. Вы можете снова вызвать change_database, но это будет неприятно при попытке использовать методы, которые выполняют запросы, от объектов, которые больше не связаны с правильной базой данных. Кроме того, очевидно, что вы не сможете присоединиться к таблицам, которые принадлежат к различным базам данных.
Чтобы справиться с этим, ActiveRecord должен быть значительно расширен. К настоящему моменту должен быть плагин, который поможет вам в решении этой проблемы. Быстрое исследование дало мне следующее:
DB-Charmer: http://kovyrin.github.com/db-charmer/
Я готов попробовать. Сообщите мне, что сработает для вас.
Я прошел мимо этого, добавив это в начало моих моделей, используя другую базу данных
class Customer < ActiveRecord::Base
ENV["RAILS_ENV"] == "development" ? host = 'devhost' : host = 'prodhost'
self.establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "myuser",
:password => "mypass",
:database => "somedatabase"
)
Вы также должны проверить этот проект под названием DB Charmer: http://kovyrin.net/2009/11/03/db-charmer-activerecord-connection-magic-plugin/
DbCharmer - простой, но мощный плагин для ActiveRecord, который делает несколько вещей:
- Позволяет легко управлять соединениями моделей AR (
switch_connection_to
)- Позволяет переключать стандартные подключения AR-моделей к отдельным серверам/базам данных
- Позволяет вам легко выбирать, куда должен идти ваш запрос (
on_*
family)- Позволяет автоматически отправлять запросы чтения своим подчиненным устройствам, в то время как мастера обрабатывают все обновления.
- Добавляет несколько миграций баз данных в ActiveRecord
Стоит отметить, что во всех этих решениях вам нужно помнить о закрытии пользовательских подключений к базе данных. В противном случае вы столкнетесь с соединениями и увидите проблемы с таймаутом запроса.
Простое решение - clear_active_connections! в файле after_filter вашего контроллера.
after_filter :close_custom_db_connection
def close_custom_db_connection
MyModelWithACustomDBConnection.clear_active_connections!
end
в вашем config/database.yml сделать что-то вроде этого
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
database: mysite_development
test:
<<: *default
database: mysite_test
production:
<<: *default
host: 10.0.1.55
database: mysite_production
username: postgres_user
password: <%= ENV['DATABASE_PASSWORD'] %>
db2_development:
<<: *default
database: db2_development
db2_test:
<<: *default
database: db2_test
db2_production:
<<: *default
host: 10.0.1.55
database: db2_production
username: postgres_user
password: <%= ENV['DATABASE_PASSWORD'] %>
то в ваших моделях вы можете ссылаться на db2 с помощью
class Customers < ActiveRecord::Base
establish_connection "db2_#{Rails.env}".to_sym
end
В этом вопросе вы описали многопользовательскую (идентично структурированные базы данных с разными данными в каждой). Жемчужина квартиры отлично подходит для этого.
Для общего вопроса о нескольких базах данных в Rails: ActiveRecord поддерживает несколько баз данных, но Rails не предоставляет способ управлять ими. Я недавно создал Multiverse gem для решения этой проблемы.
Лучшее решение, которое я нашел на данный момент, таково: есть 3 архитектуры баз данных, к которым мы можем обратиться. - Единая база данных для одного арендатора - Отдельная схема для каждого арендатора - Общая схема для арендаторов
Примечание: у них есть определенные плюсы и минусы, зависит от вашего варианта использования.
Я получил это из этого блога ! Стоит очень полезно для меня.
Вы можете использовать драгоценный камень квартира для рельсов