Имеет и принадлежит многим отношениям с несколькими базами данных
-
06-07-2019 - |
Вопрос
У меня есть ситуация, когда у меня есть две модели, компании и разрешения, когда компании находятся в отдельной базе данных от моей базы данных разрешений. Это имеет и относится ко многим отношениям, потому что каждая компания может иметь много разрешений, и каждое разрешение может принадлежать многим компаниям.
Причина, по которой две базы данных разделены, заключается в том, что база данных компании запускает производственное приложение с высоким спросом, а база данных разрешений контролирует разрешения для другого приложения.
С помощью rails он ищет таблицу соединений в той же базе данных, что и основная таблица. Например, если я делаю company.permissions, он ищет в базе данных компании company_permissions. Если я сделаю так, чтобы разрешение.companies отображало базу данных разрешений.
Какое наилучшее решение для использования имеет и относится ко многим отношениям с несколькими базами данных?
Решение
Имеет и принадлежит многим стар, неуклюж и проблематичен. Я рекомендую вместо этого использовать has_many. Вы можете указать таблицу отношений с помощью символов ": through " вариант; просто выберите базу данных, в которой вы хотите ее разместить, и создайте модель для ее представления. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many р>
Другие советы
Интересный вопрос. Ради собственной справки позвольте мне кратко изложить решение, предложенное в книге Rails Recipe в контексте этого вопроса.
1) Сначала добавьте в database.yml
permissions:
adapter: mysql
database: permissions
username: root
password:
socket: /tmp/mysql.sock
2) Сделайте модель разрешения для вызова внешней базы данных
class Permission < ActiveRecord::Base
establish_connection :permissions
end
3) Создайте (перенесите) таблицу ссылок на разрешения с столбцом Идентификатор разрешения
4) Используйте модель PermissionReference в качестве ссылки на модель Permission
class PermissionReference < ActiveRecord::Base
belongs_to :permission
has_and_belongs_to_many :companies,
:join_table => 'companies_permissions',
:foreign_key => 'permission_id'
end
5) Наконец, ассоциируйте компанию с разрешением
class Company < ActiveRecord::Base
has_and_belongs_to_many :permissions,
:class_name => 'PermissionReference',
:join_table => 'companies_permissions',
:association_foreign_key => 'permission_id'
end
Возможно, вы захотите подумать о рефакторинге с помощью подклассов моделей, которые вызывают внешнюю базу данных
class External < ActiveRecord::Base
self.abstract_class = true
establish_connection :permissions
end
class Permission < External
end
Если данные компаний меняются не очень часто, возможно, вы могли бы синхронизировать данные в базе данных разрешений, а затем выполнить естественное объединение. CMS, которую я унаследовал, делает нечто подобное, когда аутентификация пользователя находится в его собственной базе данных, и все разрешения и тому подобное хранятся там, а учетные записи пользователей синхронизируются с локальной базой данных для каждого сайта. Таким образом, учетные записи пользователей могут совместно использоваться (особенно для администрирования) на нескольких сайтах с одним входом.
Может быть не самым лучшим, потому что происходит синхронизация. В идеале вы должны просто сохранить данные компании в базе данных разрешений, если вы не можете переместить разрешения. Если, конечно, вы не присоединитесь к компании в другом месте.