Er der en grund (andre end den allerede nævnte dato), hvorfor du ikke ville bruge de indbyggede gruppefunktionsfunktioner i ActiveRecord? Du ser ud til at være bekymret over "efterbehandling", hvilket jeg ikke synes er noget at bekymre sig om.
Du er i Rails, så du skal nok lede efter en Rails-løsning først[1]. Min første tanke ville være at gøre noget lignende
Product.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])
som ActiveRecord blev til stort set den SQL, du beskrev. Forudsat at der er en erklæret has_many
forbindelse mellem købmand og produkt, så ville du nok være bedre at bruge det, så noget som:
ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")
[
Efter alt det er du tilbage, hvor du startede, men du kom dertil på en mere konventionel Rails-måde (og Rails værdsætter virkelig konventioner!). Nu skal vi udfylde hullerne.
Jeg går ud fra, at du kender dit datointerval, lad os sige, at det er defineret som alle datoer fra from_date
til to_date
.
date_aves = (from_date..to_date).map{|dt| [dt, 0]}
Det opbygger den komplette liste over datoer som en matrix. Vi har ikke brug for de datoer, hvor vi fik et gennemsnit:
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
Det parti ser lidt rodet ud for mig:Jeg tror, det kunne være mere rent og renere. Jeg ville undersøge opbygningen af en Hash eller Struct i stedet for at blive i arrays.
[1] Jeg siger ikke, at du ikke skal bruge SQL - der opstår situationer, hvor ActiveRecord ikke kan generere den mest effektive forespørgsel, og du falder tilbage på find_by_sql
. Det er fint, det skulle være sådan, men jeg synes, du skal prøve kun at bruge det som en sidste udvej.