我正在开发一个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
有什么想法吗?
答案 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 }