2017-01-29 83 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