ruby-on-rails - references - rails has_one through
Tiene y pertenece a muchas relaciones con mĂșltiples bases de datos (3)
Si los datos de las empresas no cambian muy a menudo, tal vez 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.
Tengo una situación donde 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. 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.
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?
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
Interesante pregunta. Por el bien de mi propia referencia, permítanme intentar resumir la solución propuesta en el libro Rails Recipe en el contexto de esta pregunta.
1) Primero agrega en database.yml
permissions:
adapter: mysql
database: permissions
username: root
password:
socket: /tmp/mysql.sock
2) Hacer modelo de permiso para llamar a una base de datos externa
class Permission < ActiveRecord::Base
establish_connection :permissions
end
3) Crear (migrar) una tabla de referencia de permisos con la columna Id de permiso
4) Utilice el modelo de PermissionReference como un enlace al modelo de 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, asocie a 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 mediante la subclasificación de modelos que llama a una base de datos externa
class External < ActiveRecord::Base
self.abstract_class = true
establish_connection :permissions
end
class Permission < External
end