Имеет и принадлежит многим отношениям с несколькими базами данных - PullRequest
7 голосов
/ 09 октября 2008

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

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

С помощью rails он ищет таблицу соединений в той же базе данных, что и основная таблица. Например, если я делаю company.permissions, он ищет в базе данных компании company_permissions. Если я делаю с разрешением, то он просматривает базу данных разрешений.

Какое наилучшее решение для использования имеет и относится ко многим отношениям с несколькими базами данных?

Ответы [ 3 ]

6 голосов
/ 09 октября 2008

Интересный вопрос. Для справки позвольте мне вкратце изложить решение, предложенное в книге 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 модель в качестве ссылки на Разрешение модель

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
5 голосов
/ 09 октября 2008

Имеет и принадлежит многим стар, неуклюж, и проблематичен. Я рекомендую вместо этого использовать has_many. Вы можете указать таблицу отношений с помощью опции:: through; просто выберите базу данных, в которой вы хотите ее разместить, и создайте модель для ее представления. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

1 голос
/ 09 октября 2008

Если данные компаний меняются не очень часто, возможно, вы могли бы синхронизировать данные в базе данных разрешений, а затем выполнить естественное объединение. CMS, которую я унаследовал, делает нечто подобное, когда аутентификация пользователя находится в его собственной базе данных, и все разрешения и тому подобное хранятся там, а учетные записи пользователей синхронизируются с локальной базой данных для каждого сайта. Таким образом, учетные записи пользователей могут быть разделены (особенно для администрирования) на нескольких сайтах с одним логином.

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

...