Conectando a multiples base de datos

Hola,

Estoy desarrollando una aplicación Multi-Empresa, al ingresar el usuario
deberá seleccionar la empresa, y los modelos deberán apuntar
automáticamente a la base de datos correspondiente, hasta el momento lo
que he logrado comprender es que debo utilizar establish_connection :

class ModeloBase < ActiveRecord::Base
establish_connection # Algún código
end

class Productos < ModeloBase

end

¿ Cómo manejo el punto inicial ?
¿ En algún algún momento el usuario podrá cambiar de empresa, cómo
manejo esto ?
¿ Existe una manera Rails de gestionar esto ?
¿ Algún PlugIn ?

Les agradezco de antemano la ayuda.


Jaime Mora R.

On Mar 31, 2007, at 12:16 AM, Jaime Mora R. wrote:

Hola,

Estoy desarrollando una aplicación Multi-Empresa, al ingresar el
usuario
deberá seleccionar la empresa, y los modelos deberán apuntar
automáticamente a la base de datos correspondiente

Montar una base de datos por empresa es un follon, lo normal es
parametrizar el esquema y tener solo una base de datos.

De acuerdo totalmente con Xavier.

El día 30/03/07, Xavier N. [email protected] escribió:

Xavier N. wrote:

Montar una base de datos por empresa es un follon, lo normal es
parametrizar el esquema y tener solo una base de datos.

Agradezco bastante tu respuesta, con parametrizar el esquema te refieres
a que si tengo el modelo Movimiento, para todas las consultas que haga
se deberá filtrar con el id de la empresa seleccionada ?

¿ O existe una manera más correcta de gestionar esto ?

Saludos.

Jaime Mora R.

Xavier N. wrote:

Montar una base de datos por empresa es un follon, lo normal es
parametrizar el esquema y tener solo una base de datos.

Me estás recomendando seguir este camino ? :

class Empresa < ActiveRecord::Base
has_many :cuentas
end

class Cuenta < ActiveRecord::Base
belongs_to :empresa
has_many :movimientos
end

class Movimiento < ActiveRecord::Base
belongs_to :cuenta
end

De tal manera que si necesitamos todos los movimientos de la cuenta 2
que pertenece a la empresa 1 tendríamos que hacer :

Empresa.find(1).cuentas.find(2).movimientos

Y así en toda la aplicación.

Saludos.

Jaime Mora R.

On Mar 31, 2007, at 12:43 AM, Jaime Mora R. wrote:

Xavier N. wrote:

Montar una base de datos por empresa es un follon, lo normal es
parametrizar el esquema y tener solo una base de datos.

Agradezco bastante tu respuesta, con parametrizar el esquema te
refieres
a que si tengo el modelo Movimiento, para todas las consultas que haga
se deberá filtrar con el id de la empresa seleccionada ?

Exacto.

Tendras una tabla de empresas e hijas de esta. Si una empresa tiene
un asociado un modelo producto, este tendra un enterprise_id. Si el
producto tiene categorias, en la tabla de categorias ya no hay
enterprise_id, puesto que el product_id acota por si solo a la
empresa a la cual pertenece. Por la logica de la aplicacion,
partiendo de una empresa (que es el punto de entrada) no sera posible
llegar a ver una categoria de otra.

Hay que tener cuidado con que una empresa no pueda ver datos de otra.
Al llegar un peticion uno de los filtros de mayor prioridad suele ser
uno que determina la empresa a la que aplica. Una vez se tiene, por
ejemplo el usuario de sesion ya no se instancia con

User.find(session[:user])

sino que se instancia usando

@current_user = @current_enterprise.users.find(session[:user])

y en general siempre acotas de ese modo donde toque:

@current_enterprise.products.find_by_url_id(params[:id])

Etc., ves la idea.

Es comun dar acceso a las distintas empresas usando URLs del tipo

http://.miaplicacion.com

El plugin Account Location

http://agilewebdevelopment.com/plugins/account_location

facilita las cosas para ofrecer eso.

– fxn

Jaime Mora R. wrote:

Xavier N. wrote:

On Mar 31, 2007, at 12:43 AM, Jaime Mora R. wrote:

Xavier N. wrote:

Tendras una tabla de empresas e hijas de esta. Si una empresa tiene
un asociado un modelo producto, este tendra un enterprise_id. Si el
producto tiene categorias, en la tabla de categorias ya no hay
enterprise_id, puesto que el product_id acota por si solo a la
empresa a la cual pertenece. Por la logica de la aplicacion,
partiendo de una empresa (que es el punto de entrada) no sera posible
llegar a ver una categoria de otra.

Recuerda que para estos casos existe with_scope y ahora en Rails 2.1
named_scope !!!

http://railscasts.com/episodes/5
http://railscasts.com/episodes/108

Saludos!

Xavier N. wrote:

On Mar 31, 2007, at 12:43 AM, Jaime Mora R. wrote:

Xavier N. wrote:

Tendras una tabla de empresas e hijas de esta. Si una empresa tiene
un asociado un modelo producto, este tendra un enterprise_id. Si el
producto tiene categorias, en la tabla de categorias ya no hay
enterprise_id, puesto que el product_id acota por si solo a la
empresa a la cual pertenece. Por la logica de la aplicacion,
partiendo de una empresa (que es el punto de entrada) no sera posible
llegar a ver una categoria de otra.

Excelente. Muchas gracias, ha sido de gran ayuda.

Saludos.


Jaime Mora R.