Pregunta

Tengo una situación en la que tengo dos modelos, compañías y permisos, donde las compañías están en una base de datos separada de mi base de datos de permisos. Esta es una relación que tiene y pertenece a muchas porque cada compañía puede tener muchos permisos y cada permiso puede pertenecer a muchas compañías.

La razón por la cual las dos bases de datos están divididas 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 primaria. Por ejemplo, si hago los permisos de la compañía, busca en la base de datos de la compañía los permisos de la compañía. Si hago permiso.companies se ve 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?

¿Fue útil?

Solución

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 el ": a través de " opción; simplemente elija en qué base de datos desea que resida y cree un modelo para representarlo. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

Otros consejos

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

1) Primero agregue database.yml

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

2) Hacer un modelo de permiso para llamar a una base de datos externa

class Permission < ActiveRecord::Base

  establish_connection :permissions

end 

3) Cree (migre) una tabla de referencia de permisos con la columna Id. de permisos

4) Use el modelo PermissionReference como un enlace al modelo Permiso

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, asociar la empresa al 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 la refactorización subclasificando los modelos que llaman a una base de datos externa

class External < ActiveRecord::Base

  self.abstract_class = true
  establish_connection :permissions

end

class Permission < External
end

Si los datos de la compañía no cambian muy a menudo, tal vez podría sincronizar los datos en la base de datos de permisos, entonces únase de forma natural. Un CMS que heredé está haciendo algo así cuando la autenticación del usuario se encuentra 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 de 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 hay una sincronización involucrada. Idealmente, debería almacenar los datos de la empresa en la base de datos de permisos si no puede mover los permisos. A menos, por supuesto, que te unas a una compañía en otro lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top