2008-10-08 17 views
7

Tengo una situación en la que tengo dos modelos, compañías y permisos, donde las empresas se encuentran en una base de datos separada de mi base de datos de permisos. Esto es un ha y pertenece a muchas relaciones porque cada empresa puede tener muchos permisos y cada permiso puede pertenecer a muchas compañías.Tiene y pertenece a muchas relaciones con bases de datos múltiples

La razón por la cual las dos bases de datos se dividen es porque la base de datos de la compañía ejecuta una aplicación de producción de alta demanda y la base de datos de permisos controla los permisos para otra aplicación.

Con rieles, busca la tabla de unión en la misma base de datos que la tabla principal. Por ejemplo, si hago company.permissions, se ve en la base de datos de la compañía para company_permissions. Si hago permission.companies, busca en la base de datos de permisos.

¿Cuál es la mejor solución para usar un has y pertenece a muchas relaciones con múltiples bases de datos?

Respuesta

5

Tiene y pertenece a muchos es viejo, torpe y problemático. Recomiendo usar has_many en su lugar. Puede especificar la tabla de relaciones con la opción ": through"; solo elija en qué base de datos desea que se encuentre y cree un modelo para representarlo. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

+0

La razón por la que he recogido esta respuesta durante la respuesta más completa a continuación es porque con la respuesta a continuación, aún necesita hacer algún tipo de sincronización. Con este método, solo necesita decirle a ruby ​​el nombre de la tabla. – Steropes

1

Si los datos de las empresas no cambian muy a menudo, quizás podría sincronizar los datos en la base de datos de permisos, y luego unirse naturalmente. Un CMS que heredé hace algo así cuando la autenticación de usuario está en su propia base de datos, y los permisos y demás están almacenados allí, y las cuentas de usuario se sincronizan con la base de datos local para cada sitio. De esta forma, las cuentas de usuario podrían compartirse (especialmente para la administración) en varios sitios con 1 inicio de sesión.

Puede que no sea el mejor porque se trata de una sincronización. Idealmente, debería almacenar los datos de la compañía en los permisos db si no puede mover los permisos. A menos, por supuesto, que se una a otra empresa.

6

Pregunta interesante. Por mi propia referencia, permítanme intentar resumir la solución propuesta en el libro Rails Recipe en el contexto de esta pregunta.

1) Primero agregue en la base de datos .yml

permissions: 
    adapter: mysql 
    database: permissions 
    username: root 
    password: 
    socket: /tmp/mysql.sock 

2) Hacer modelo de permiso para llamar base de datos externa

class Permission < ActiveRecord::Base 

    establish_connection :permissions 

end 

3) Crear (migrar) una tabla de referencia Permiso con Id Permiso columna

4) Uso PermissionReference modelo como un enlace a Permiso modelo

class PermissionReference < ActiveRecord::Base 

    belongs_to :permission 
    has_and_belongs_to_many :companies, 
          :join_table => 'companies_permissions', 
          :foreign_key => 'permission_id' 

end 

5) Por último asociado Compañía de Permiso

class Company < ActiveRecord::Base 

    has_and_belongs_to_many :permissions, 
          :class_name => 'PermissionReference', 
          :join_table => 'companies_permissions', 
          :association_foreign_key => 'permission_id' 

end 

Es posible que desee considerar refactorización subclasificando modelos que llama una base de datos externa

class External < ActiveRecord::Base 

    self.abstract_class = true 
    establish_connection :permissions 

end 

class Permission < External 
end 
+0

Esta respuesta es muy similar a esta página: https://calshare.berkeley.edu/sites/AS/Web_Apps/ruby/Wiki%20Pages/Connecting%20to%20Multiple%20Databases.aspx – Steropes

+1

Sí, esa página es básicamente una copia de la receta 15 encontrados en el libro Rails Recipe en el que se basó mi respuesta. :) – JasonOng

Cuestiones relacionadas