Twoim błędem było użycie fill_at w kolejności prawdopodobnie w domyślnym zakresie.
Możesz to naprawić, używając unscoped, aby wyeliminować domyślne zakresy:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
lub
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
ale myślę, że lepiej będzie używać gdzie zamiast mieć
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Musisz uważać na używanie TIMESTAMP, ponieważ 2012-12-04 stanie się 2012-12-04 00:00:00, więc jeśli nie chcesz, aby ten dzień był wynikiem, użyj Date.today - (n - 1)
Jeśli utworzysz indeks na kolumnie fill_at
create index incomes_filled_at on incomes(filled_at);
migracja:
add_index :incomes, :filled_at
i masz dużo danych w tym indeksie tabeli, które zostaną użyte do filtrowania. Więc zapytanie powinno być znacznie szybsze.
Więc po prostu napisz oba i przetestuj, co jest szybsze (musisz utworzyć indeks na fill_at, jeśli go nie masz).