2017-08-07 6 views
0

Ich habe ein Array von Ereignisobjekten. Jedes Ereignis hat einen Hash namens location mit den Schlüsseln Name, Adresse, Bundesland, Stadt, Postleitzahl. Jedoch haben nicht alle Standorte diese Schlüssel. Ich möchte nur die Werte der Schlüssel anzeigen, wenn sie da sind. Hier ist mein CodeZeige nur Werte, die in einem Ruby-Hash sind

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{event.location[:name]}, #{event.location[:address]}, #{event.location[:city]}, #{event.location[:state]}, #{event.location[:zipcode]}" 
    end 
end 

Das funktioniert gut, wenn ich eine vollständige Adresse habe. Aber wenn ich nur den Namen des Orts haben zeigt es wie folgt

Location: Central Park, , , , 

Wie kann ich die überschüssigen Komma loswerden? Manchmal könnte es 2 oder 3 Nachkommata sein. Ich weiß, wie man eines los wird, aber wenn die Anzahl der abschließenden Kommas nicht gesetzt ist, bin ich nicht sicher, wie es geht. Würde es vorziehen, die Standortinformationen in einer Zeile anzuzeigen.

Jede Hilfe wäre willkommen.

Antwort

5

ich so etwas tun würde:

@events.each do |event| 
    values = event.location.values_at(:name, :address, :city, :state, :zipcode).compact 
    puts "Location: #{values.join(', ')}" unless values.empty? 
end 

Oder Sie möchten vielleicht eine Methode zu Ihrer Event Klasse hinzufügen.

def stringified_location 
    values = location.values_at(:name, :address, :city, :state, :zipcode).compact 
    values.join(', ') unless values.empty? 
end 

Und es so nennen:

@events.each do |event| 
    stringified_location = event.stringified_location 
    puts "Location: #{stringified_location}") if stringified_location 
end 
+3

... und mache das auch zur Verantwortung der 'Event' Klasse, sollte ich denken. –

+0

Das ist perfekt. Ich danke dir sehr!! –

0

Sie können die Hash-Werte mit .values packen und sie dann in einen String kombinieren mit den entsprechenden Trennzeichen .join(", "):

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{event.location.values.join(", ")}" 
    end 
end 
+2

Wahrscheinlich sind die Werte nicht in der gewünschten Reihenfolge. – Stefan

+0

@Stefan Du hast absolut recht, und ich habe daran gearbeitet, meine Antwort zu verbessern, als mich Spickermann dazu brachte. Upvoting ihn! – eiko

0

Sie können nur ein Array mit den Werten erstellen und sie dann beitreten:

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{[event.location[:name], event.location[:address], event.location[:city]}, event.location[:state], event.location[:zipcode]].compact.join(', ')}" 
    end 
end 
+1

Ah, ich wusste nicht, kompakt, dachte, es sollte eine elegantere Lösung geben :-) –

0

Eine Möglichkeit ist, nur um den Wert zu setzen in ein Array und dann verbinden Sie sie.

@events.each do |event| 
    if !event.location.empty? 
    location = [event.location[:name], event.location[:address], event.location[:city], event.location[:state], event.location[:zipcode]] 
    location -= [nil] #remove empty elements 
    puts "Location: #{location.join(', ')}" 
    end 
end 
Verwandte Themen