Buenas!
El caso es que llevo unas semanas con un proyectito personal hecho con este framework: Me apetecía aprender a usarlo (para ver por que estaba todo el mundo tan emocionado), tengo poco que hacer en el trabajo y un amigo me comento una idea para hacer una aplicación que encaja bastante bien dentro del objetivo de RoR.
Ahora, después de tres semanas dedicadas por entero a esto, tengo el proyecto casi listo para producción (aunque me quedan muchos detalles y cosas por añadir) y creo que tengo un conocimiento básico suficiente tanto de Ruby como de Rails… En estas tres semanas he encontrado muchas cosas que me han gustado y varias que no (si acaso, ya escribiré otra bitácora al respecto).
Pero aun tengo unas cuantas dudas (y no consigo encontrar respuestas por internet) así que lanzo unas preguntas al tendido a ver si algún alma caritativa me contesta o me apunta en la dirección correcta.
1. Rendimiento y escalabilidad (esta es larga, lo siento).
La gente se mete mucho con el rendimiento de Rails, sobre todo después de lo de Twitter, pero no es eso lo que me interesa ahora mismo. Mi interés va mas bien por la conexión con la base de datos, me explico con un ejemplo (encontrado en el libro RailsSpace, que es uno de los que he ido siguiendo en mi aprendizaje):
Tenemos tres modelos: User, Spec y Faq, User es la información básica del usuario (nickname, contraseña), Spec es la información sobre la persona (Nombre real, sexo, dirección) y Faq contiene la información sobre los gustos del usuario. Evidentemente, cada usuario (User) tiene un objeto Spec y un objeto Faq asociados, la cosa seria así:
class User < ActiveRecord::Base
has_one :spec, :dependent => :destroy
has_one :faq, :dependent => :destroy
end
class Spec < ActiveRecord::Base
belongs_to :user
end
class Faq < ActiveRecord::Base
belongs_to :user
end
Hasta aquí bien, fácil y sencillo (por cierto, el cómo se definen las relaciones es una de las cosas que mas me han gustado de Rails), a partir de ahí, se puede acceder al Spec asociado a determinado usuario diciendo “user.spec”, eso lazara una query por detrás que recuperara el objecto Spec asociado a ese usuario… y aquí es donde entra mi pregunta.
Si hacemos una búsqueda por nombre real (como se hace en el libro), primero tendremos que lanzar una consulta a BBDD con el texto que queremos buscar (parte o todo el nombre real), en el resultado se muestran, sobre todo, datos contenidos en el Spec, así que una query nos da casi todos los datos que queremos, sin embargo en la lista de resultados ira un link a la pagina del perfil del usuario, con lo que necesitaremos también esa información (en el libro se hace con spec.user, que lanza otra select).
Eso implica que se hace una query por búsqueda mas N queries mas donde N es el numero de resultados(!), Si los resultados son dos usuarios, se hacen tres consultas a la BBDD, pero que pasa si se devuelven 1000 resultados? Se hacen 1001 consultas? Eso es algo que se podría hacer tranquilamente con una sola. La parte de la BBDD en este caso es fácil de arreglar, son relaciones 1:1 así que se pueden juntar en una tabla o hacer una vista con los datos que necesitamos, pero que pasa con ejemplos mas complejos, o que pasa con el lado de Rails? Se pueden rellenar varios modelos con solo un find? Como se podría evitar este problema?
2. Mantenimiento de sesiones
Otra de las cosas que me ha gustado de Rails es la libertad a la hora de elegir como se van a manejar las sesiones, en Java dependes básicamente de como lo haya implementado el servidor de aplicaciones (que, generalmente, consiste en mantenerlas en memoria o en el sistema de archivos). En general recomiendan usar el ActiveRecord Store, que almacena las sesiones en una tabla en BBDD y es muy fácil de configurar (descomentar una linea) y poner a punto (rake db:sessions:create).
Pero que pasa con el mantenimiento? En las pruebas que estoy haciendo solo hay una o dos sesiones en la tabla, se crean bien, mantienen el estado del usuario bien, etc, etc… Y como se borran? Se hace automáticamente? Se debe de configurar de alguna manera? Como? Lo único que he encontrado al respecto es rake:sessions:clear, que borra todo el contenido de la tabla de sesiones, pero eso “echaría” a todos los usuarios que estén conectados en ese momento… No hay una forma mejor?
3. Gems
Esta es una duda que me ha surgido en relación con mi hosting: Dan soporte básico para RoR pero no tengo acceso por SSH y no puedo instalar gems por el método tradicional (por linea de comando).
Esta claro que si continuo haciendo cosillas en este entorno tendré que cambiar de hosting a uno en el que tenga mas libertad, pero, de momento, hay alguna forma de instalar gems como Ferret, hpricot y demás de alguna manera sin tener que usar la linea de comandos? He leído algo sobre hacer “Freeze” de plugins e incluso algunas entradas de blogs sobre instalar dichas gems en el directorio “vendor”, pero en general son poco mas que comentarios sin instrucciones especificas y/o dependen de otros plugins. Seria factible en mi caso? Alguien me puede señalar donde encontrar información sobre esto?
En fin, siento el tostón y agradezco el esfuerzo a cualquiera que llegue hasta aqui leyendo. Gracias!
Entrada publicada originalmente en Barrapunto