Kesalahan Anda adalah menggunakan fill_at secara berurutan mungkin dalam lingkup default.
Anda dapat memperbaikinya menggunakan unscoped untuk menghilangkan cakupan default:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
atau
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
tapi saya pikir lebih baik menggunakan where daripada memiliki
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Anda harus berhati-hati dalam menggunakan TIMESTAMP karena 2012-12-04 akan menjadi 12-12-04 00:00:00 jadi jika Anda tidak ingin hari ini dalam hasil gunakan Date.today - (n - 1)
Jika Anda membuat indeks pada kolom fill_at
create index incomes_filled_at on incomes(filled_at);
migrasi:
add_index :incomes, :filled_at
dan Anda memiliki banyak data dalam indeks tabel ini akan digunakan dalam penyaringan. Jadi kueri harus jauh lebih cepat.
Jadi tulis saja keduanya dan uji mana yang lebih cepat (Anda harus membuat indeks di fill_at jika Anda tidak memilikinya).