あなたの間違いは、おそらくデフォルトのスコープで、filled_atを順番に使用することでした。
スコープなしを使用して修正し、デフォルトのスコープを削除できます:
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')
2012-12-04は2012-12-0400:00:00になるため、TIMESTAMPの使用には注意する必要があります。したがって、この日を結果として使用したくない場合は、Date.today-(n-1)
>filled_at列にインデックスを作成する場合
create index incomes_filled_at on incomes(filled_at);
移行:
add_index :incomes, :filled_at
このテーブルには大量のデータがあり、インデックスはフィルタリングに使用されます。したがって、クエリははるかに高速になるはずです。
したがって、両方を記述して、どちらが高速かをテストしてください(インデックスがない場合は、filled_atにインデックスを作成する必要があります)。