He estado buscando en toda la web y no tengo ni idea.Rieles: Cómo compilar estadísticas por día/mes/año o Cómo faltan las funciones SQL agnósticas de bases de datos (ej .: STRFTIME, DATE_FORMAT, DATE_TRUNC)
- Supongamos que usted tiene que construir un panel de control en el área de administración de la aplicación Rails y que desea tener el número de suscripciones por día.
- Suponga que está utilizando SQLite3 para el desarrollo, MySQL para la producción (configuración bastante estándar)
Básicamente, hay dos opciones:
1) recuperar todas las filas de la base de datos usando Subscriber.all
y agregada a día en la aplicación Rails usando el Enumerable.group_by
:
@subscribers = Subscriber.all
@subscriptions_per_day = @subscribers.group_by { |s| s.created_at.beginning_of_day }
Creo que esta es una muy mala idea. Recuperar todas las filas de la base de datos puede ser aceptable para una aplicación pequeña, pero no se escalará en absoluto. ¡Funciones de agregación y fecha de la base de datos para el rescate!
2) ejecutar una consulta SQL en la base de datos utilizando agregada y funciones de fecha:
Subscriber.select('STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions').group('day')
que se desarrollará en esta consulta SQL:
SELECT STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions
FROM subscribers
GROUP BY day
mucho mejor. Ahora los agregados se hacen en la base de datos que está optimizada para este tipo de tarea, y solo se devuelve una fila por día de la base de datos a la aplicación Rails.
... pero espera ... ¡ahora la aplicación tiene que activarse en mi entorno de producción que usa MySQL! Reemplazar STRFTIME()
con DATE_FORMAT()
. ¿Qué pasa si mañana me cambio a PostgreSQL? Reemplazar DATE_FORMAT()
con DATE_TRUNC()
.
Me gusta desarrollar con SQLite. Simple y fácil. También me gusta la idea de que Rails es agnóstico de base de datos. Pero ¿por qué Rails no proporciona una forma de traducir funciones de SQL que hacen exactamente lo mismo, pero tienen una sintaxis diferente en cada RDBMS (esta diferencia es realmente estúpida, pero bueno, es demasiado tarde para quejarse)?
No puedo creer que encuentre tan pocas respuestas en la Web para una característica tan básica de una aplicación de Rails: cuente las suscripciones por día, mes o año.
Dime que me falta algo :)
EDITAR
Ha sido un par de años desde que he publicado esta pregunta. La experiencia me ha demostrado que debería usar el mismo DB para dev y prod. Entonces, considero irrelevante el requisito de agnóstico de la base de datos.
Dev/prod parity FTW.
¿Cuál es la versión de sus rieles? – Lachezar
Estoy usando Rails 3. – lakim
Es un problema más complicado de lo que parece ser. Para ver por qué, piense en esta pregunta: "¿Cuántas horas hay en un día?" La respuesta es "24, en promedio si ignora los segundos intercalares". Es solo una respuesta promedio debido a los cambios en el horario de verano, y eso es algo que a los políticos les gusta jugar. La duración de un día también es específica de la localidad. ¿Debería la base de datos estar al tanto de todo ese bálsamo flamista barroco burocrático, o es algo que es, en cambio, un aspecto de la aplicación de visualización? –