Multiples bases de datos con un fichero database.yml

Hola

Esto es mas una curiosidad que me asalto ayer mientras estaba
trasteando con el fichero database.yml.

Mi pregunta es si desde una misma aplicación y dependiendo del
usuario que se conectase a ella, ver si se podría modificar el
fichero database.yml para que se accediese a una base de datos distinta.

Ejemplo, cinco usuarios, cinco bases de datos. cada uno accedería a
la suya.

¿es esto posible?

Aunque no lo he probado, se me había ocurrido (una tontería fijo :-
( que el usuario una vez valido, la aplicacion modificase el fichero
database.yml con la base de datos correspondiente. Creo que no
funcionaria por que habría que reiniciar el webrick ¿no?

Alguna otra idea?

Gracias. Saludos.

Buenas,
Mira tenes 2 formas, una mas manual y la otra mas prolija.
La manual:
class AbstractApplicationController < ActionController::Base

here, we hop into the front of the request-handling

pipeline to run a method called hijack_db

before_filter :hijack_db

here, weâ??re going to manually establish a connection

to the database we feel like connecting to.

def hijack_db
# completely ridiculous condition
is_odd = Time.now.hour % 2 == 1

 # determine the database name
 db_name = is_odd ? â??dis_odd_dbâ? : â??dat_even_dbâ?

 # lets manually connect to the proper db
         ActiveRecord::Base.establish_connection(
   :adapter  => â??mysqlâ?,
   :host     => â??localhostâ?,
   :username => â??mr_robotoâ?,
   :password => â??secret_secret_i_got_a_secretâ?,
   :database => db_name
 )

end
end

La mas prolija es poner otros connection strings en database.yml
ademas del development, testing y production, y luego poner en el
environment que se conectea esa base tambien.

Para ver mas:
http://wiki.rubyonrails.com/rails/pages/HowtoUseMultipleDatabases

Saludos


Diego D. Lapiduz
Sinai IT
www.sinai.com.ar
www.eminds.com.ar

On Oct 7, 2006, at 9:43 AM, alarkspur wrote:

Hola

Esto es mas una curiosidad que me asalto ayer mientras estaba
trasteando con el fichero database.yml.

Mi pregunta es si desde una misma aplicación y dependiendo del
usuario que se conectase a ella, ver si se podría modificar el
fichero database.yml para que se accediese a una base de datos distinta.

Ejemplo, cinco usuarios, cinco bases de datos. cada uno accedería a
la suya.

¿es esto posible?

Aunque no lo he probado, se me había ocurrido (una tontería fijo :-
( que el usuario una vez valido, la aplicacion modificase el fichero
database.yml con la base de datos correspondiente. Creo que no
funcionaria por que habría que reiniciar el webrick ¿no?

Alguna otra idea?

Gracias. Saludos.

Ah, me olvide, una recomendacion… usa 1 sola base es infinitamente
mas practico, es para eso que esta pensado Rails y es lo que
recomiendan.

Saludos


Diego D. Lapiduz
Sinai IT
www.sinai.com.ar
www.eminds.com.ar

On Oct 7, 2006, at 9:43 AM, alarkspur wrote:

Hola

Esto es mas una curiosidad que me asalto ayer mientras estaba
trasteando con el fichero database.yml.

Mi pregunta es si desde una misma aplicación y dependiendo del
usuario que se conectase a ella, ver si se podría modificar el
fichero database.yml para que se accediese a una base de datos distinta.

Ejemplo, cinco usuarios, cinco bases de datos. cada uno accedería a
la suya.

¿es esto posible?

Aunque no lo he probado, se me había ocurrido (una tontería fijo :-
( que el usuario una vez valido, la aplicacion modificase el fichero
database.yml con la base de datos correspondiente. Creo que no
funcionaria por que habría que reiniciar el webrick ¿no?

Alguna otra idea?

Gracias. Saludos.

Muchas gracias por las sugerencias, como dije fue una curiosidad que
me asalto :slight_smile: y que ahora implementare en local por probar y aprender
un poquillo mas.

Lo que me habéis recomendado es que no es nada practico, ¿por que ?
( a parte de los “cons” que aparecen en el wiki )

Una base de datos para cada usuario, corriendo con un solo servidor
es un poco (por no decir bastante) complicado.

Ah, me olvide, una recomendacion… usa 1 sola base es
infinitamente mas practico, es para eso que esta pensado Rails y
es lo que recomiendan.

no es practico, por velocidad? por complejidad en su desarrollo? se
saturaria el servidor? por que mi aplicación estaría llena de modelos?

Si los usuarios son muchos (digamos, mas de 10) entonces el problema
es otro, y la solucion de multiples bases de datos no es la mas
apropiada.

Cual seria la mas apropiada? una base de datos para cada uno?

Yo me imaginaba que seria de utilidad, para el siguiente caso:

por ejemplo si muchos usuarios desean gestionar los contenidos de sus
respectivas webs,
al no tener entre ellos nada que ver las bases de datos serian
completamente distintas.
No seria mejor hacer un gestor de contenidos que se conectase a
distintas bases de datos para modificar el contenido (según el
usuario), que hacer un gestor de contenidos para cada uno, no se,
pregunto?

Gracias.

Los servidores de bases de datos generalmente estan diseñados para
manejar pocas (unas veinte, digamos) bases de datos separadas, con
algunas tablas (no mas de cientos por base de datos) y con muchos
registros en cada tabla (millones o mas, no es problema). Ir en
contra de este diseño implica enfrentarse a limitaciones, bugs e
inconvenientes.

Por ejemplo, si cada usuario va a tener su propia base de datos,
tienes que crearla, asignarle los permisos y mas importante aun,
mantener al dia el esquema de las tablas. Si son solo 10 o 20
usuarios diferentes, no es tan dificil, pero si estas hablando de
2000, la cosa se complica un poco y puedes perder un dia completo
solo porque decidiste agregar un campo nuevo en una de las tablas.

Ademas, a menos que estes dispuesto a reescribir los drivers de mysql
de rails, tendrias que mantener una conexion abierta para cada una de
las bases de datos. De nuevo otro aspecto que cuando empiezas a
multiplicar, puede sobrecargar innecesariamente al servidor.

Si cada usuario va a tener requerimientos distintos, entonces es mas
facil hacer aplicaciones separadas. Despues de todo, la filosofia de
Rails se centra en el objetivo de hacer muy facil escribir una
aplicacion a tu medida si estar intentando reusar porque es mas facil
reescribir (gracias a rails) que configurar algo reusable.

Una base de datos para cada usuario, corriendo con un solo servidor
es un poco (por no decir bastante) complicado.

Si son pocos los usuarios, lo mas recomendable es correr varios
servidores diferentes, cada uno con su propio database.yml (tengo
unos cuantos trucos para manejar varios servidores con
configuraciones diferentes corriendo el mismo codigo de rails).

Si los usuarios son muchos (digamos, mas de 10) entonces el problema
es otro, y la solucion de multiples bases de datos no es la mas
apropiada.

muy amable por la explicación y gracias por las aclaraciones.

Un saludo.