2016-07-22 8 views
1

Ich habe einige Code gehackt, der seinen Zweck erfüllt, aber es fühlt sich sehr klobig/ineffizient. Aus einer Tabelle mit vielen Einträgen hat jeder eine Monats- und Jahreszeichenfolge: "September 2016" usw. Daraus erstelle ich ein chronologisch geordnetes Array von Monaten und deren Häufigkeiten, die in einem Dropdown-Auswahlformular verwendet werden: ['November 2016 (5), September 2016 (5)].Effizienz von Ruby-Code: Hash von Monat + Häufigkeit in formatierte sortierte Array

@months = [] 

banana = Post.pluck(:month) 
#array of all months posted in, eg ['September 2016', 'July 2017', etc 

strawberry = banana.each_with_object(Hash.new(0)){|key,hash| hash[key] += 1} 
#hash of unique month + frequency 

strawberry.each { |k, v| strawberry[k] = "(#{v.to_s})" } 
#value into string with brackets 

pineapple = (strawberry.sort_by { |k,_| Date.strptime(k,"%b %Y") }).reverse 
#sorts into array of months ordered by most recent 

pineapple.each { |month, frequency| @months.push("#{month}" + " " + "#{frequency}") } 
#array of formatted months + frequency, eg ['July 2017 (5)', 'September 2016 (5)'] 

Ich hatte gehofft, einige der Ruby-Gurus hier könnten mir in mancher Hinsicht helfen, diesen Code zu verbessern. Irgendwelche Ideen oder Vorschläge würden sehr geschätzt werden!

Danke!

Antwort

1
['September 2016', 'July 2017', 'September 2016', 'July 2017'] 
    .group_by { |e| e } # .group_by(&:itself) since Ruby2.3 
    .sort_by { |k, _| Date.parse(k) } 
    .reverse 
    .map { |k, v| "#{k} (#{v.count})" } 

#⇒ [ 
# [0] "July 2017 (2)", 
# [1] "September 2016 (2)" 
# ]