Gibt es einen Grund (anders als den bereits erwähnten), warum Sie die eingebauten Gruppenfunktionsfähigkeiten in ActiveRecord nicht verwenden würden? Sie scheinen sich Sorgen um die "Nachbearbeitung" zu machen, was meiner Meinung nach kein Grund zur Sorge ist.
Sie befinden sich in Rails, also sollten Sie wahrscheinlich zuerst nach einer Rails-Lösung suchen[1]. Mein erster Gedanke wäre, so etwas wie
zu tunProduct.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])
aus dem ActiveRecord so ziemlich das von Ihnen beschriebene SQL wurde. Angenommen, es gibt einen deklarierten has_many
Verbindung zwischen Händler und Produkt, dann sollten Sie diese wahrscheinlich besser verwenden, also so etwas wie:
ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")
(Ich hoffe, dass Ihre Beschreibung des Modells als "products_sold" eine Art Transkriptionsfehler ist, übrigens - wenn nicht, liegen Sie mit Ihrer Klassenbenennung etwas daneben!)
Nach all dem sind Sie wieder dort, wo Sie angefangen haben, aber Sie sind auf eine konventionellere Rails-Weise dorthin gekommen (und Rails schätzt Konventionen wirklich!). Jetzt müssen wir die Lücken füllen.
Ich gehe davon aus, dass Sie Ihren Datumsbereich kennen, sagen wir, er ist definiert als alle Daten ab from_date
bis to_date
.
date_aves = (from_date..to_date).map{|dt| [dt, 0]}
Dadurch wird die vollständige Liste der Daten als Array erstellt. Wir brauchen die Daten nicht, an denen wir einen Durchschnitt erhalten haben:
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
Das Ganze sieht für mich etwas unübersichtlich aus:Ich denke, es könnte knapper und sauberer sein. Ich würde versuchen, einen Hash oder eine Struktur zu erstellen, anstatt in Arrays zu bleiben.
[1] Ich sage nicht, dass Sie SQL nicht verwenden sollten – es gibt Situationen, in denen ActiveRecord nicht die effizienteste Abfrage generieren kann und Sie auf find_by_sql
zurückgreifen . Das ist in Ordnung, es soll so sein, aber ich denke, Sie sollten versuchen, es nur als letzten Ausweg zu verwenden.