Имеет и принадлежит многим отношениям с несколькими базами данных

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

Вопрос

У меня есть ситуация, когда у меня есть две модели, компании и разрешения, когда компании находятся в отдельной базе данных от моей базы данных разрешений. Это имеет и относится ко многим отношениям, потому что каждая компания может иметь много разрешений, и каждое разрешение может принадлежать многим компаниям.

Причина, по которой две базы данных разделены, заключается в том, что база данных компании запускает производственное приложение с высоким спросом, а база данных разрешений контролирует разрешения для другого приложения.

С помощью 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, которую я унаследовал, делает нечто подобное, когда аутентификация пользователя находится в его собственной базе данных, и все разрешения и тому подобное хранятся там, а учетные записи пользователей синхронизируются с локальной базой данных для каждого сайта. Таким образом, учетные записи пользователей могут совместно использоваться (особенно для администрирования) на нескольких сайтах с одним входом.

Может быть не самым лучшим, потому что происходит синхронизация. В идеале вы должны просто сохранить данные компании в базе данных разрешений, если вы не можете переместить разрешения. Если, конечно, вы не присоединитесь к компании в другом месте.

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