Sai lầm của bạn là sử dụng fill_at theo thứ tự có lẽ trong phạm vi mặc định.
Bạn có thể sửa nó bằng cách sử dụng unscoped để loại bỏ phạm vi mặc định:
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
hoặc
Income.unscoped
.group('date(filled_at)')
.having("date(filled_at) > ?", Date.today - n)
.sum(:lines_price)
.order('date(filled_at) ASC')
nhưng tôi nghĩ rằng tốt hơn sẽ là sử dụng ở đâu thay vì có
Income.unscoped
.where("date(filled_at) > TIMESTAMP ?", Date.today - n)
.group('date(filled_at)')
.sum(:lines_price)
.order('date(filled_at) ASC')
Bạn phải cẩn thận khi sử dụng TIMESTAMP vì 2012-12-04 sẽ trở thành 2012-12-04 00:00:00 nên nếu bạn không muốn kết quả là ngày này, hãy sử dụng Date.today - (n - 1)
Nếu bạn tạo chỉ mục trên cột fill_at
create index incomes_filled_at on incomes(filled_at);
di chuyển:
add_index :incomes, :filled_at
và bạn có nhiều dữ liệu trong bảng này chỉ mục sẽ được sử dụng để lọc. Vì vậy, truy vấn sẽ nhanh hơn nhiều.
Vì vậy, chỉ cần viết cả hai và kiểm tra cái nào nhanh hơn (bạn phải tạo chỉ mục trên fill_at nếu chưa có).