En la parte superior de mi cabeza podría ejecutar una nueva instancia de servidor para cada subdominio utilizando un entorno diferente.
Pero eso no se escalará muy bien.
Sin embargo, las primeras google hits for multiple rails databases arrojan algunas sugerencias nuevas. Al juntar la información en esos enlaces se proporciona esta solución totalmente no probada para una sola instancia de servidor.
Deberá agregar una entrada de base de datos para cada subdominio en sus databases.yml. A continuación, agregue un before_filter a su controlador de aplicación
¡Actualización! Ejemplo recarga las configuraciones de la base de datos dinámicamente. Lamentablemente, no hay una buena manera de hacer que la actualización se desplace a gran velocidad sin interferir con el funcionamiento interno de su servidor. Por lo tanto, la configuración de la base de datos tendrá que volver a cargarse en cada solicitud.
Este ejemplo supone que las entradas de la base de datos en databases.yml llevan el nombre de los subdominios.
config/database.yml aplicación
login: &login
adapter: mysql
username: rails
password: IamAStrongPassword!
host: localhost
production:
<<: *login
database: mysite_www
subdomain1:
<<: *login
database: mysite_subdomain1
subdomain2:
<<: *login
database: mysite_subdomain2
...
/controladores/application_controller.rb requieren 'erb' before_filter: switch_db_connection
def switch_db_connection
subdomain = request.subdomains.first
ActiveRecord::Base.configurations = YAML::load(ERB.new(IO.read(Rails.configuration.database_configuration_file)).result)
ActiveRecord::Base.establish_connection("mysite_#{subdomain}")
end
Como ya he dicho que es completamente sin probar. Pero no preveo ningún problema importante. Si no funciona con suerte, te pone en el camino correcto.
+1 - Definitivamente muy útil. ¿Me puede dar una idea del rendimiento alcanzado (si es que se nota) con este enfoque? –
Lo siento, no tengo un punto de referencia con respecto a esto. Solo tengo esto trabajando en una versión beta privada en este momento. – Kris
¿Alguien tiene alguna especulación sobre si esto tendrá un rendimiento terrible o no? Me gustaría hacer algo similar para un sitio de producción. – NotDan