使用ruby迭代yaml数组

使用ruby迭代yaml数组,ruby,arrays,Ruby,Arrays,我将YAML.load_文件应用于我的示例文件: --- languages: - name: "English" iso_639: "en" native_name: "English" region: - '' - UK - US - name: "Klingon" iso_639: "tlh" native_name: "tlhIngan Hol" region: - notearth

我将
YAML.load_文件
应用于我的示例文件:

---
languages:
  - name: "English"
    iso_639: "en"
    native_name: "English"
    region:
      - ''
      - UK
      - US
  - name: "Klingon"
    iso_639: "tlh"
    native_name: "tlhIngan Hol"
    region:
      - notearth
我想迭代这些语言和区域数组。这不起作用:

records.each do |record|
  record.region.each do |region|
    self.create!
  end
end

record.region
为区域提供未知方法错误。如何迭代语言及其区域?或者,如何访问区域数组?

Yaml被加载到哈希中,因此其形式如下:

languages: [
{
  name: "English"
  iso_639: "en"
  native_name: "English"
  region: ['', 'UK', 'US']
}
{
  name: "Klingon"
  iso_639: "tlh"
  native_name: "tlhIngan Hol"
  region: ['notearth']
}]
所以你需要像这样迭代:

results = YAML.load_file(file)
results['languages'].flat_map{|l| l['region']}.each do |region|
  self.create!
end

您的代码中有两个错误:

  • 加载YAML文件后得到的对象不是数组,而是散列,比如文件名为
    foo.yml

    YAML.load_file('foo.yml')
    # => {"languages"=>[{"name"=>"English", "iso_639"=>"en", ...
    
    因此,您必须按如下方式修改代码以使其正常工作:

    records['languages'].each do |record|
      # ...
    
  • region
    不是散列
    记录的方法,它是一个键,您必须使用
    record['region']
    访问相关值

  • 您必须使用的正确代码是:

    records['languages'].each do |record|
      record['region'].each do |region|
        # My guess is you are going to use `region` inside this block
        self.create!
      end
    end
    

    “这不管用”到底是什么意思?你有错误吗?您得到的结果不是您期望的结果?我编辑了我的问题,以便将实际问题最小化。Symbol是Rails扩展吗?@WayneConrad是的,它是Hanks。我提到它是因为OP没有用Rails标记这个问题。当然,大多数Ruby问题都是关于Rails的。@WayneConrad-确实如此。我假设这是针对rails应用程序的(因为
    self.create!
    。如果不是,不使用它和使用字符串就可以了。我会更新答案。我建议使用
    flat\u map{…}
    而不是
    map{…}。flatte
    CONFIG = YAML.load_file("file.yml")
    puts CONFIG # {"languages"=>[{"name"=>"English", "iso_639"=>"en", "native_name"=>"English", "region"=>["", "UK", "US"]}, {"name"=>"Klingon", "iso_639"=>"tlh", "native_name"=>"tlhIngan Hol", "region"=>["notearth"]}]}
    
    CONFIG['languages'].map{|l| l['region']}