Динамически подключать модель к базам данных в работающем приложении? - PullRequest
7 голосов
/ 08 июня 2009

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 12 июня 2009

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

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

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...

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

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

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

# foo.rb
LogItem.establish_connection :atlanta

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

0 голосов
/ 08 июня 2009

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

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

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

Есть также некоторые проекты, готовые к полупроизводству проектов , атакующие эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...