2017-03-29 2 views
0

Ich habe eine Funktion:Verwenden Gruppe von und zu sortieren, indem sie in verschachtelter Hash

tracks.group_by { |t| t[:track].track_category } 

, die einen Hash erzeugt:

{ 

#<TrackCategory id: 2, order: 0> => 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}], 

#<TrackCategory id: 1, order: 1> => 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}] 
} 

Ich habe versucht, die TrackCategories nach Reihenfolge zu sortieren, und im Innern Sortiere die Tracks nach promo_order.

Das hält mir eine Fehlermeldung, und ich bin sicher, ich bin

tracks.group_by { |t| t[:track].track_category }.sort_by { |t| t[:order] }.sort_by { |t| t[:promo_order] } 
+0

Welche Fehler gibt es Ihnen? Wie sind die Objekte angelegt? (d. h. was sind ihre Beziehungen zu anderen Dingen?) –

Antwort

1

Sie passieren ein Schlüssel-Wert-Paar etwas falsch zu machen, die von group_by kam und wurde als ein Array zu sort_by dazu gezwungen, und dann versuchen, auf einen Schlüssel im Array zuzugreifen, was natürlich nicht existiert.

Mit anderen Worten, Sie verwechseln die Eingabe in sort_by verwendet. In der ersten sort_by ist |t| ein Hash-Schlüsselpaar, das von group_by generiert und in ein Array der Form [k,v] umgewandelt wird. In Ihrem Fall t ist:

[ #<TrackCategory id: 2, order: 0>, 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}], 
#... 
] 

Also, was Sie wollen, ist das Array in seine Elemente zu zerlegen, so dass Sie diejenigen bekommen, die Sie wollen, so etwas wie:

tracks.group_by { |t| t[:track].track_category } 
    .sort_by { |t, _| t[:order] } # here you're sorting by TrackCategory#[:order] 

Und etwas Ähnliches auf die zweite Zeile, aber stattdessen [:promo_order] verwenden.

Verwandte Themen