Ihr Fehler war, filled_at in der Reihenfolge wahrscheinlich im Standardbereich zu verwenden.
Sie können dies beheben, indem Sie unscoped verwenden, um Standardbereiche zu eliminieren:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
oder
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
aber ich denke, dass es besser ist, where statt have
zu verwendenIncome.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Sie müssen bei der Verwendung von TIMESTAMP vorsichtig sein, da 2012-12-04 zu 2012-12-04 00:00:00 wird. Wenn Sie diesen Tag also nicht als Ergebnis haben möchten, verwenden Sie Date.today - (n - 1)
Wenn Sie einen Index für die Spalte „filled_at“ erstellen
create index incomes_filled_at on incomes(filled_at);
Migration:
add_index :incomes, :filled_at
und Sie haben viele Daten in diesem Tabellenindex, der beim Filtern verwendet wird. Die Abfrage sollte also viel schneller sein.
Schreiben Sie also einfach beides und testen Sie, was schneller ist (Sie müssen einen Index auf filled_at erstellen, wenn Sie keinen haben).