2016-04-30 8 views
1

Ich bin über einen stripe charge object Iterieren und ich möchte die amount insgesamt für jeden Tag zusammenzufassen.Summe aller Betrag, wenn Ladungsdaten sind die gleichen in Streifen

# Returns an array object of charges for a customer 
@customer_charges = Stripe::Charge.all(:customer => current_user.stripeid) 

Aufrufe:

<% @customer_charges.map do |c| %> 
    On Monday, you were charged a total of <%= c.amount %> 
<% end %> 

Sicherlich die oben tut nichts anderes, als Ausgangsleitungen der einzelnen Gebühren, jedoch nicht die Summe für den Tag. Die Schwierigkeit, der ich gegenüberstehe, besteht darin, alle Gebühren für jeden Tag zusammenzufassen. Könnte mir jemand in die richtige Richtung zeigen?

Der Ausgang wäre wie:

"On Monday, you were charged a total of 200000" 
"On Tueesday, you were charged a total of 500000" 
etc... 

Statt:

On Monday, you were charged a total of 100000" 
On Monday, you were charged a total of 100000" 
etc... 

Meine view mit den Linien der if statements unordentlich aussieht Daten zu vergleichen und das sieht nicht richtig aus.

+0

Sie wahrscheinlich mit 'each' hier statt' map' werden sollte. Was ist "erstellt"? Ist das eine Spalte oder eine Methode? – tadman

+0

Ok. 'Created' ist json Unix-Zeitstempel des Streifens:' "erstellt": 1462001409, ' – Sylar

+0

Warum in Höhe von insgesamt Sie Zeitstempel? Das macht keinen Sinn für mich. Wenn Sie sie als Daten benötigen, wird 'Time.at (timestamp)' konvertiert. – tadman

Antwort

2

Sie müssen durch jede Ladung Objekt in Streifen zu durchlaufen, um die Menge und die analysierte Datum für jede Ladungsspeicher:

# Fetch charges in batches of 100 records from Stripe API, yield each individual charge to a block. 
def each_stripe_charge_for_customer(customer_id) 
    starting_after = nil 
    loop do 
    customer_charges = Stripe::Charge.all(customer: customer_id, limit: 100, starting_after: starting_after) 
    break if customer_charges.none? 
    charges.each do |charge| 
     yield charge 
    end 
    starting_after = charges.data.last.id 
    end 
end 

charges_by_date = Hash.new(0) 

# For each Stripe charge, store the date and amount into a hash. 
each_stripe_charge_for_customer(current_user.stripeid) do |stripe_charge| 
    # Parses Stripe's timestamp to a Ruby date object. `to_date` converts a DateTime object to a date (daily resolution). 
    charge_date = Time.at(stripe_charge.created).to_date 
    charge_amount = stripe_charge.amount 

    charges_by_date[charge_date] += charge_amount 
end 
+0

Das ist alles recht gut, aber ein paar Dinge: 'charges_by_date' könnte' Hash.new (0) ', wenn Sie einen Standardwert von 0 mögen, dass der' || = 'Test später vermeidet. 'Date.strptime' ist viel klüger als' Time.at', was den Job prägnant macht. – tadman

+0

Ich werde später dazu gehen. Danke – Sylar

+0

@tadman Wusste nicht über 'Hash.new (0)', danke. –

Verwandte Themen