2017-01-29 123 views
2

erb -template,我想遍歷一個YAML收集像這樣的:循環遍歷集合YAML,按密鑰

collection: 
    - title: "title a" 
    year: 2017 
    - title: "title b" 
    year: 2017 
    - title: "title b" 
    year: 2016 
    - ... 

在輸出文件(格式爲降價),我想訂購逐年不同的項目和其拆分,而無需事先其中values爲年 - key存在認識:

# 2017 
* title a 
* title b 

# 2016 
* title c 
… 

這能與紅寶石的each do -loop實現?


跟進

我有一個跟進的問題。下面給出的解決方案工作正常。現在,我希望能夠在我的ERB模板中使用由此實現的排序/組功能。以下代碼輸出所需的結果。但是,如何在ERB模板中調用這種排序/組功能,以便「conferencecontribution」集合中的條目相應地排序?

(作爲一個側面說明,YAML文件還包括需要訂購其他收藏品,因而它很可能意義,使這個功能?)

dataset = YAML.load_file('cv.de.yaml') 

dataset['conferencecontributions'].group_by { |hash| hash['year'] } 
     .sort_by { |year, _| -year } 
     .each do |year, entries| 
    puts "# #{year}" 
    entries.each do |entry| 
    puts "* #{entry["title"]} #{entry["location"]}" 
    end 
    puts 
end 

回答

2

你需要多group_bysort_by

require 'yaml' 

collection = YAML::load(%q{ 
collection: 
    - title: "title a" 
    year: 2017 
    - title: "title b" 
    year: 2017 
    - title: "title c" 
    year: 2016})["collection"] 


collection.group_by { |hash| hash['year'] } 
      .sort_by { |year, _| -year } 
      .each do |year, entries| 
    puts "# #{year}" 
    entries.map { |entry| entry['title'] }.sort.each do |title| 
    puts "* #{title}" 
    end 
    puts 
end 

它輸出:

# 2017 
* title a 
* title b 

# 2016 
* title c 
+0

謝謝,這工作得很好!我有一個後續問題(請參閱編輯)。 – sgosh

+0

這應該可能是一個新問題,可能與此鏈接。 –

1

在回答你的後續問題(這也許應該被張貼作爲一個單獨的問題):是的,你應該定義此方法,如下面的:

def by_year(data, &block) 
    years = data.group_by {|hash| hash['year'] } 
     .sort_by {|year,| -year } 
    block ? years.each(&block) : years 
end 

那麼你可以使用它在您的ERB這樣的:

<% by_year(dataset['conferencecontributions']) do |year, entries| %> 
    <h1><%= year %></h1> 
    <ul> 
    <% entries.each do |entry| %> 
    <li><%= entry["title"] %>, <%= entry["location"] %></li> 
    <% end %> 
    </ul> 
<% end %> 

看到它在repl.it:https://repl.it/F3Vl