Ditt misstag var att använda filled_at i ordning, förmodligen i standardomfattning.
Du kan fixa det genom att använda unscoped för att eliminera standardscopes:
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 jag tror att det är bättre att använda var istället för att ha
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Du måste vara försiktig med att använda TIMESTAMP eftersom 2012-12-04 kommer att bli 2012-12-04 00:00:00 så om du inte vill ha den här dagen i resultat använd Date.today - (n - 1)
Om du skapar index på filled_at-kolumnen
create index incomes_filled_at on incomes(filled_at);
migrering:
add_index :incomes, :filled_at
och du har mycket data i detta tabellindex kommer att användas i filtrering. Så frågan borde vara mycket snabbare.
Så skriv bara båda och testa vilket som är snabbare (du måste skapa index på filled_at om du inte har något).