आपकी गलती यह थी कि शायद डिफ़ॉल्ट दायरे में भरकर_एट का इस्तेमाल किया जाए।
डिफ़ॉल्ट स्कोप को खत्म करने के लिए आप इसे अनस्कोप्ड का उपयोग करके ठीक कर सकते हैं:
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')
आपको TIMESTAMP का उपयोग करने के बारे में सावधान रहना होगा क्योंकि 2012-12-04 2012-12-04 00:00:00 हो जाएगा, इसलिए यदि आप परिणाम में इस दिन को नहीं चाहते हैं तो Date.today - (n - 1)
अगर आप fill_at कॉलम पर इंडेक्स बनाते हैं
create index incomes_filled_at on incomes(filled_at);
माइग्रेशन:
add_index :incomes, :filled_at
और आपके पास इस तालिका में बहुत अधिक डेटा है, फ़िल्टरिंग में अनुक्रमणिका का उपयोग किया जाएगा। तो क्वेरी बहुत तेज होनी चाहिए।
तो बस दोनों लिखें और परीक्षण करें जो तेज़ है (यदि आपके पास एक नहीं है तो आपको fill_at पर अनुक्रमणिका बनाना होगा)।