Uw fout was om filled_at in volgorde te gebruiken, waarschijnlijk in het standaard bereik.
U kunt het oplossen door gebruik te maken van unscoped om standaardscopes te elimineren:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
of
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
maar ik denk dat het beter is om waar te gebruiken in plaats van
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Je moet voorzichtig zijn met het gebruik van TIMESTAMP omdat 04-12-2012 wordt 2012-12-04 00:00:00 dus als je deze dag niet als resultaat wilt gebruiken, gebruik dan Date.today - (n - 1)
Als u een index maakt in de kolom filled_at
create index incomes_filled_at on incomes(filled_at);
migratie:
add_index :incomes, :filled_at
en je hebt veel gegevens in deze tabelindex die zal worden gebruikt bij het filteren. Het opvragen zou dus veel sneller moeten zijn.
Dus schrijf gewoon beide en test wat sneller is (je moet een index maken op filled_at als je er geen hebt).