क्या कोई कारण है (पहले से उल्लिखित तिथि के अलावा) आप ActiveRecord में अंतर्निहित समूह फ़ंक्शन क्षमताओं का उपयोग क्यों नहीं करेंगे? ऐसा लगता है कि आप "पोस्ट-प्रोसेसिंग" के बारे में चिंतित हैं, जो मुझे नहीं लगता कि वास्तव में चिंता का विषय है।
आप रेल में हैं, इसलिए आपको शायद पहले रेल समाधान की तलाश करनी चाहिए [1]। मेरा पहला विचार कुछ ऐसा करना होगा
Product.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])
कौन सा ActiveRecord आपके द्वारा वर्णित SQL में बहुत अधिक बदल गया है। मान लें कि एक घोषित has_many
है व्यापारी और उत्पाद के बीच संबंध, तो आप शायद इसका उपयोग करना बेहतर समझते हैं, इसलिए कुछ ऐसा:
ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")
(मुझे आशा है कि "products_sold" के रूप में मॉडल का आपका विवरण किसी प्रकार की ट्रांसक्रिप्शन त्रुटि है, btw - यदि नहीं, तो आप अपनी कक्षा के नामकरण के साथ कुछ हद तक ऑफ-मैसेज हैं!)
आखिरकार, आप वापस वहीं हैं जहां आपने शुरू किया था, लेकिन आप वहां एक और पारंपरिक रेल तरीके से पहुंचे (और रेल वास्तव में सम्मेलनों को महत्व देते हैं!) अब हमें रिक्तियों को भरने की जरूरत है।
मैं मान लूंगा कि आप अपनी तिथि सीमा जानते हैं, मान लें कि इसे from_date
से सभी तिथियों के रूप में परिभाषित किया गया है से to_date
. तक ।
date_aves = (from_date..to_date).map{|dt| [dt, 0]}
यह एक सरणी के रूप में तिथियों की पूरी सूची बनाता है। हमें उन तिथियों की आवश्यकता नहीं है जहां हमें औसत मिला:
ave_price_dates = ave_prices.collect{|ave_price| ave_price[0]} # build an array of dates
date_aves.delete_if { |dt| ave_price.dates.index(dt[0]) } # remove zero entries for dates retrieved from DB
date_aves.concat(ave_prices) # add the query results
date_aves.sort_by{|ave| ave[0] } # sort by date
वह बहुत कुछ मुझे थोड़ा अव्यवस्थित लगता है:मुझे लगता है कि यह छोटा और साफ-सुथरा हो सकता है। मैं सरणियों में रहने के बजाय हैश या स्ट्रक्चर बनाने की जांच करूंगा।
[1] मैं यह नहीं कह रहा हूं कि SQL का उपयोग न करें - ऐसी स्थितियां होती हैं जहां ActiveRecord सबसे कुशल क्वेरी उत्पन्न नहीं कर सकता है और आप find_by_sql
पर वापस आते हैं . यह ठीक है, इसे ऐसा ही होना चाहिए, लेकिन मुझे लगता है कि आपको इसे केवल अंतिम उपाय के रूप में उपयोग करने का प्रयास करना चाहिए।