2010-11-21 7 views
2

Ich habe einen Activerecord-ArrayRuby-Inject Methode Problem

[#<Lead id: 134, address: "24 elm33",created_at: "2010-11-15 12:08:25", updated_at: "2010-11-16 12:53:36", usd_conv: 2741>, 
#<Lead id: 136, address: "guigiu", created_at: "2010-11-17 16:57:45", updated_at: "2010-11-17 16:57:45", usd_conv: 1000>] 

und ich möchte dies injizieren Verwendung ändern [[created_at, usd_conv (Gesamtzahl für diese Zeit)]]

Alle Assistenten da draußen wissen, wie man das macht?

+0

Spezifischer sein. Sie wollen Summe, Folge von Teilsummen bekommen? – samuil

+0

Entschuldigung, um klarzustellen, ich suche nach der Sequenz von Teilsummen. also aus dem obigen Beispiel hätte ich [[2010-11-15 12:08:25, 2741], [2010-11-17 16:57:45, 3741]]. Danke nochmal Jungs – stuartchaney

+0

okay, ich reparierte meine Antwort –

Antwort

3

Angenommen, Sie müssen „für jede einzelne created_at Zeit berechnen Summe aller usd_conv bis zu dieser Zeit“, geschieht dies durch Werte one-by-one in eine Datenstruktur zu injizieren. Hier ist ein Beispiel, dass „injiziert“ Datensätze in Zwei-Wert-Array:

  • das erste Element resultierende Aufzeichnungen
  • die zweite ansammelt akkumuliert die Summe für einen aktuellen Moment

    array.inject([0,[]]) do |so_far,elem| 
        so_far[0] += elem.usd_conv 
        so_far[1] << [elem.created_at, so_far[0]] 
        so_far # Necessary because block should return the next so_far 
    end 
    
+0

Vielleicht irre ich mich, aber ich nehme an, dass created_at hat so dichte Auflösung, dass Sie Hash mit Anzahl der Elemente gleiche Anzahl von Original-Aufzeichnungen erhalten ... – samuil

+0

Prost Pavel. das ist es, abgesehen von der Gesamtaufstellung am Anfang. Danke noch einmal. – stuartchaney

0
array.collect!{|e| [e.created_at, e.usd_conv]} 
+0

Danke für Ihre Antwort Eimantas :), aber ich fürchte, ich bin auf der Suche nach der Gesamtzahl von usd_conv. Ich denke, inject ist der richtige Weg zu gehen, aber ich weiß es nicht so gut .. – stuartchaney

0

Es ist keine typische Anwendung der inject (reduce) Methode. Idee ist es zu verwenden, während Sie Array in Einzelwert reduzieren. Wenn Sie hier inject über anderen Iteratoren verwenden, können Sie lokale Variablen nicht explizit definieren (was gut ist, wenn Sie einen funktionalen Ansatz haben). Was Sie wirklich brauchen, ist Kombination von map und inject - mit Array von Werten in Akkumulator geleitet meiner Meinung nach schmutzigen Trick ist;)

Da es keine spezielle Methode ist, solche Dinge zu tun, ich map bleiben würde (oder map!) :

accumulator = 0 
ary.map! {|el| [el.created_at, accumulator += el.usd_conv]} 

Downside ist auf höherer Ebene Umfang mit Akku überladen.

Version map mit scheint 2--3 mal schneller zu sein, wenn gebenchmarkt (map vs map! Version).