Грешката ви беше да използвате filled_at в реда на вероятно в обхвата по подразбиране.
Можете да го коригирате, като използвате unscoped, за да премахнете обхватите по подразбиране:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
или
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
но мисля, че ще бъде по-добре да се използва където вместо да има
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Трябва да внимавате с използването на TIMESTAMP, защото 2012-12-04 ще стане 2012-12-04 00:00:00, така че ако не искате този ден в резултат, използвайте Date.today - (n - 1)
Ако създадете индекс на filled_at колона
create index incomes_filled_at on incomes(filled_at);
миграция:
add_index :incomes, :filled_at
и имате много данни в тази таблица, индексът ще бъде използван при филтриране. Така че заявката трябва да бъде много по-бърза.
Така че просто напишете и двете и тествайте кое е по-бързо (трябва да създадете индекс на filled_at, ако нямате такъв).