2010-01-24 3 views
2

Я пишу более простую версию phpMyAdmin в Rails; это веб-приложение будет работать на веб-сервере (где пользователи смогут указывать имя базы данных, имя хоста, имя пользователя, пароль и номер порта одного из серверов баз данных, работающих в одной сети). Затем пользователь будет подключен к этой машине и сможет использовать пользовательский интерфейс для администрирования этой базы данных (добавлять или удалять столбцы, таблицы перетаскивания и т. Д.).Несколько соединений с базой данных в Rails

У меня есть два взаимосвязанных вопроса (ваша помощь очень поможет мне в понимании того, как лучше подойти к этому):

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

  2. Различные пользователи могут подключаться к различным базам данных (или даже к хостам). Я предполагаю, что мне нужно отслеживать связь между установленным соединением базы данных и сеансом пользователя. Каков наилучший способ достичь этого?

Заранее спасибо.

ответ

2
  1. Для предотвращения Рельсы из инициализации ActiveRecord с помощью database.yml, вы можете просто удалить :active_record из config.frameworks в конфигурации/environment.rb. Затем, чтобы вручную установить соединения, вы используете ActiveRecord::Base.establish_connection. (И, возможно, ActiveRecord::Base.configurations)

    ActiveRecord хранит все соединения, связанные с переменными класса. Поэтому, если вы хотите динамически создавать несколько соединений, вам также необходимо динамически подклассифицировать ActiveRecord :: Base и называть connect_connection.

    Это будет ваш абстрактный базовый класс для любого подкласса, который вы будете использовать для управления таблицами. Чтобы ActiveRecord знал об этом, вы должны сделать self.abstract_class = true в определении базового класса.

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

  2. Это сложнее, потому что вы, конечно, не можете продолжать поддерживать связь. Непосредственное решение, о котором я могу думать, это хранить уникальный токен в сеансе и использовать его в файле before_filter, чтобы вернуться к динамическому подклассу ActiveRecord :: Base, который вы, вероятно, будете хранить в хеше.

    Это становится более интересным, когда вы начинаете запуск нескольких рабочих процессов Rails:

    • Вы должны хранить всю информацию соединения с базой данных в сессии, так что другие сотрудники могут использовать его.
    • Возможно, вам понадобится согласованный уникальный токен между рабочими, поэтому используйте хеш-функцию для комбинации параметров подключения к базе данных.
    • Поскольку рабочий может быть вызван с токеном, о котором он еще не знает, ваша логика подкласса и установления_соединения, вероятно, произойдет в файле before_filter. (Например, вместо момента входа в систему.)
    • Вам нужно будет найти какой-нибудь умный способ сбора и сортировки мусора, когда пользователь не выйдет из системы и истечет срок действия. (Извините, я не знаю этого.)
Смежные вопросы