如何根据类别列出YAML记录?

时间:2012-10-11 19:03:03

标签: ruby yaml

我有一个YAML数据库,其数据格式如下:

- product:
  name: Apples

- product:
  name: Grapes

如何更新它以便将每个产品分配到一个类别,然后在我的页面上我可以在一个类别标题下有一个无序列表?

例如:

Fruit
  *Apples
  *Grapes

Vegetables
  *Tomatoes
  *Broccoli

我试着搜索这样的例子,却找不到任何东西。有可能做这样的事吗?

- category:
  name: fruit

  - product:
    name: Apples

  - product:
    name: Grapes

- category:
  name: vegetables

  - product:
    name: Tomatoes

  - product:
    name: Broccoli  

2 个答案:

答案 0 :(得分:2)

我建议两种方案,第一种将所有产品组合在一起:

products:
  - name: Apple
    type: Fruit

  - name: Grape
    type: Fruit

  - name: Tomato
    type: Vegetable

  - name: Brocoli
    type: Vegetable

另一种方案将针对每种类型的产品使用组

fruits:
  - name: Apple

  - name: Grape

vegetable:
  - name: Tomato

  - name: Brocoli

要实际显示这个,你只需加载yaml数据就像(如果这已经改变,请原谅我......自从我使用yaml以来已经有一段时间了):

require 'yaml'
data = YAML.load_file('data.yml')

数据本质上只是一个红宝石哈希,因此您可以通过遍历它来显示您喜欢的任何内容。

编辑:

如果第二个选项是您想要的。请尝试以下方法:

require 'yaml'

data = YAML.load_file('data.yml')
data.each do |category, products|
  puts "#{category}"
  products.each do |product|
    puts "\t#{products}"
  end
end

输出应为:

fruits
     Apple
     Grape
vegetable
     Tomato
     Brocoli

如果要输出html,请将其修改为:

require 'yaml'

data = YAML.load_file('data.yml')
data.each do |category, products|
  puts "#{category}"
  puts "<ul>"
  products.each do |product|
    puts "<li>#{products}</li>"
  end
  puts "</ul>"
end

您可以看到添加html格式的差异非常简单,您应该能够根据需要进一步修改它。

答案 1 :(得分:0)

您只需为每个category分配Product属性:

- name: Apples
  category: Fruit
- name: Grapes
  category: Fruit
- name: Tomatoes
  category: Vegetables
- name: Broccoli
  category: Vegetables

...然后加载所有Fruit的数据:

require "yaml"
YAML.load("products.yml").select{ |product| product["category"] == "Fruit" }
# => [{"name"=>"Apples", "category"=>"Fruit"}, {"name"=>"Grapes", "category"=>"Fruit"}]