Шаблон делегата для удаленной базы данных Rails? - PullRequest
0 голосов
/ 05 октября 2009

Я работаю над приложением Rails, для которого требуются разрешения на основе ролей (назовем это «скрытым»), но приложение не будет обрабатывать аутентификацию пользователя. Главное приложение устанавливает зашифрованный cookie, а Скрытое приложение использует его в качестве доказательства аутентификации.

Скрытое приложение должно выполнять множество ролей; администратор, менеджер проекта, редактор и т. д. Я использую плагин авторизации , который создает таблицу roles и таблицу users_roles и использует отношения has_many между таблицей пользователей и таблицей ролей с использованием users_roles таблица. Пока что все довольно ванильно.

Сложность заключается в том, что в главном приложении уже есть таблица users и a users_roles. У меня есть модель Main :: User, которая использует базу данных основного приложения (создание настраиваемого соединения), но при попытке использовать инфраструктуру авторизации путем создания роли операция завершается неудачно, поскольку ActiveRecord использует информацию о соединении из Main :: User таблица, которая пытается обновить таблицы users_roles в главном приложении (что недопустимо). Я даже пытался удалить спецификацию habtm и использовать макрос has_many с опцией: through для указания таблицы соединения, но ActiveRecord по-прежнему использует базу данных Main, потому что соединение устанавливается через модель Main :: User.

Следующим шагом было внедрение Rails Recipe 15 «Соединение с несколькими базами данных», но мне не хватает части, как заставить мою локальную эталонную модель UsersReference автоматически ссылаться на таблицу users основного приложения. В рецепте упоминается: «Это решение, конечно, потребует создания необходимых строк в таблице product_references для соответствия любым продуктам, которые есть в альтернативной базе данных. Это можно сделать либо в пакетном режиме. или автоматически во время выполнения. «Я бы предпочел не поддерживать двойные копии - более 425 000 пользователей и их статус постоянно меняются, поэтому идея выполнения пакетных обновлений не очень приятна.

В идеале я хотел бы, чтобы модель UsersReference из рецепта действовала в качестве делегата таблицы users. Я предполагаю, что это будет включать автоматическое получение строк из таблицы users во время выполнения, как описано в рецепте. Есть ли у кого-то опыт в этом или что-то подобное? Буду очень признателен за ваши мысли.

1 Ответ

0 голосов
/ 28 октября 2009

Я решил это до сих пор, удалив модель UsersReference и создав модель Users в скрытом приложении. Я определил User.find_user, который проверяет, есть ли идентификатор пользователя в локальной таблице. Если это не так, пользователь выбирает его из модели Main :: User и сохраняет его локально. Модель скрытого пользователя - это модель, используемая для авторизации, которая отвечает требованиям плагина авторизации. Последнее, что мне хотелось бы, - это скрыть метод User.find, чтобы он не мог быть вызван случайно, но создание self.find (* arg) и создание защищенного или приватного не работало все еще вызывали.

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