Вопрос о Ruby-цикле и вывод результатов в файл YAML - PullRequest
0 голосов
/ 30 ноября 2010

Я работаю над сценарием 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 ]

1 голос
/ 30 ноября 2010

В этом цикле

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 }
1 голос
/ 30 ноября 2010

Когда вы делаете:

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

Вы имели в виду:

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

В противном случае вы просто назначаете info каждый раз.

Если вы собираетесь это сделать, сделайте info массивом: info = [] вместо info = ''.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...