2016-07-22 1 views
1

私はその目的を達成するためにいくつかのコードをハッキングしましたが、非常にclunky /非効率です。多くのエントリーの表から、それぞれには月と年の文字列が関連付けられています。「2016年9月」などです。これらから、ドロップダウン選択フォームで使用される月とその頻度の時間順配列を作成します:['Novemeber 2016 (5)」、「2016年9月(5)」)。Rubyコードの効率:month + frequencyのハッシュをフォーマットされたソート済み配列

@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)'] 

私はここでRubyの達人のいくつかは、このコードを改善するためのいくつかの方法で私に助言することができ期待していました。どんなアイデアや提案も大歓迎です!

ありがとうございます!

答えて

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)" 
# ] 
関連する問題