Su error fue usar filled_at en orden probablemente en el ámbito predeterminado.
Puede solucionarlo usando unscoped para eliminar los ámbitos predeterminados:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
o
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
pero creo que mejor sera usar where en lugar de tener
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Debe tener cuidado al usar TIMESTAMP porque 2012-12-04 se convertirá en 2012-12-04 00:00:00, por lo que si no desea este día como resultado, use Date.today - (n - 1)
Si crea un índice en la columnafilled_at
create index incomes_filled_at on incomes(filled_at);
migración:
add_index :incomes, :filled_at
y tiene una gran cantidad de datos en el índice de esta tabla se utilizará en el filtrado. Entonces la consulta debería ser mucho más rápida.
Así que escribe ambos y prueba cuál es más rápido (tienes que crear un índice enfilled_at si no tienes uno).