Din fejl var at bruge filled_at i rækkefølge, sandsynligvis i standardomfang.
Du kan rette det ved at bruge unscoped for at eliminere standardomfang:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
eller
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
men jeg tror, det vil være bedre at bruge hvor i stedet for at have
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Du skal være forsigtig med at bruge TIMESTAMP, fordi 2012-12-04 bliver 2012-12-04 00:00:00, så hvis du ikke vil have denne dag i resultat, brug Date.today - (n - 1)
Hvis du opretter indeks på filled_at kolonne
create index incomes_filled_at on incomes(filled_at);
migration:
add_index :incomes, :filled_at
og du har en masse data i denne tabel indeks vil blive brugt i filtrering. Så forespørgslen burde være meget hurtigere.
Så skriv bare begge dele og test, hvad der er hurtigere (du skal oprette indeks på filled_at, hvis du ikke har et).