Vaší chybou bylo použít fill_at v pořadí pravděpodobně ve výchozím rozsahu.
Můžete to opravit pomocí unscoped, abyste odstranili výchozí rozsahy:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
nebo
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
ale myslím, že lepší bude použít kde místo mít
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Při používání TIMESTAMP musíte být opatrní, protože 2012-12-04 se stane 2012-12-04 00:00:00, takže pokud nechcete, aby tento den byl ve výsledku, použijte Date.today - (n - 1)
Pokud vytvoříte index ve sloupci fill_at
create index incomes_filled_at on incomes(filled_at);
migrace:
add_index :incomes, :filled_at
a máte mnoho dat v této tabulce index bude použit při filtrování. Dotaz by tedy měl být mnohem rychlejší.
Stačí tedy napsat obojí a otestovat, co je rychlejší (pokud žádný nemáte, musíte si vytvořit index na fill_at).