Динамическое подключение модели к базам данных в работающем приложении?

StackOverflow https://stackoverflow.com/questions/966246

Вопрос

Я прочитал много существующих вопросов/тем по этой теме, но имейте в виду, что никто из них непосредственно обратились к моей проблеме.Также имейте в виду, что это НЕТ ситуация для data.yml, так как я не буду знать информацию о БД заранее.

Тем не менее, мне нужно решение для ДИНАМИЧЕСКИ подключение к нескольким базам данных в приложении Rails.Моя ситуация такова, что у меня есть несколько сайтов регистрации данных, все с простой таблицей данных (EVENTS, TIMESTAMP, VALUE).Эти сайты должны (и будут) оставаться такими, какие они есть, из-за местных приложений, которым необходимо их использовать.

Мне нужно создать приложение, которое поддерживает таблицу «MYSQL_LOGINS» и использует каждый из этих входов в систему для подключения к любой из различных баз данных и предоставления диаграмм/графиков для содержащихся в ней данных.

Моя модель «данных» останется одинаковой для всех баз данных MySQL, к которым я подключаюсь, мне просто нужно иметь возможность указать моей МОДЕЛИ для подключения к другой БД на лету.Я надеюсь, что это удивительно просто, но посмотрим.

Это было полезно?

Решение

Вы хотите ActiveRecord::Base#install_connection.Вероятно, вы захотите использовать его в абстрактном подклассе, чтобы модели, использующие соединения вручную, не мешали использованию соединений остальной частью вашего приложения:

class LogBase < ActiveRecord::Base
  self.abstract_class = true
end

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...

Если у вас когда-либо будет только одна модель, которая выполняет соединения вручную, абстрактный класс не нужен.

Знаете ли вы полный набор баз данных, к которым вы можете подключиться?Если да, то файл data.yml может вам еще пригодиться.Вы можете поместить туда всю информацию в виде каталога, дав каждой базе данных имя, а затем динамически выбирать, с какой из них устанавливать соединение в приложении, используя эти имена:

# database.yml
atlanta:
  host: atlantadb.foo.com

# foo.rb
LogItem.establish_connection :atlanta

Настройка соединений может быть довольно сложной задачей, особенно если сайты разделены глобальной сетью.Я бы подумал, имеет ли смысл использовать подход «извлечение-преобразование-загрузка» и ежечасное/ежедневное задание cron для копирования данных на централизованный сайт отчетов.Это самая базовая форма хранилища данных и очень часто используемый подход.Если вы используете MySql, Мааткит Синхронизация — это небольшой изящный инструмент, похожий на rsync для таблиц.Альтернативно вы, вероятно, используете базу данных, которая поддерживает репликацию «главный-подчиненный», хотя поддерживать ее может быть значительно сложнее.

Другие советы

Rails пока не поддерживает несколько баз данных «из коробки» (возможно, никогда не будет, кто знает).Вам придется каким-то образом перехватить соединение с базой данных в ActiveRecord для этой модели.

Здесь это активная документация записи для этого, и вот специальная документация вам придется переопределить.

Этот это то, что действительно хорошо объясняет процесс.

Это также некоторый полуготовый к производству проекты атаковать эту проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top