Ruby循环问题并将结果转储到YAML文件中

时间:2010-11-29 22:40:35

标签: ruby yaml

我正在开发一个Ruby脚本,它将一个键值对转储到yaml文件中。但由于某些原因,我的循环只抓取循环中的最后一个实例。应该有多个键值对。

代码:

# Model for languages Table
class Language < ActiveRecord::Base
end

# Model for elements Table
class Element < ActiveRecord::Base
  has_many :element_translations
end

# Model for element_translations Table
class ElementTranslation < ActiveRecord::Base
  belongs_to :element
end

# Find ALL languages
lang = Language.all
# Get all elements
elements = Element.where("human_readable IS NOT NULL")
info = ''

elements.each do |el|
  lang.each do |l|
    et = el.element_translations.where("language_id = ?", l.id)
    et.each do |tran|
      info = {
        el.human_readable.to_s => tran.content.to_s
      }
    end
    File.open(l.code.to_s + ".yml", "w", :encoding => "UTF-8") do |f|
      YAML.dump(info, f)
    end
  end
end

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

当你这样做时:

info = {
  el.human_readable.to_s => tran.content.to_s
}
你的意思是:

info << {
  el.human_readable.to_s => tran.content.to_s
}

否则,您每次只是重新分配info

如果您打算这样做,请将信息设为数组:info = []而不是info = ''

答案 1 :(得分:1)

在这个循环中

et.each do |tran|
  info = {
    el.human_readable.to_s => tran.content.to_s
  }
end

您使用具有不同值的一个键el.human_readable.to_s重复创建新哈希。但是,即使您将其重做为

info = {}
et.each do |tran|
  info[el.human_readable.to_s] = tran.content.to_s
end

你不会得到超过1个结果,因为键没有改变 - 你只需重复分配不同的值。你究竟想要倾销什么?可能你想要一个数组,而不是键值映射?

info_array = []
et.each do |tran|
  info_array << tran.content.to_s
end
info = { el.human_readable.to_s => info_array }