Если вы застряли на 1.8.7 по какой-либо причине (как и я), я прибегнул к использованию active_support/ordered_hash
. Я знаю, что activesupport
кажется большим включением, но в более поздних версиях его рефакторинг привел к тому, что вам в значительной степени требуется только та часть, которая вам нужна, в файле, а остальное исключено. Просто gem install activesupport
и включите его, как показано ниже. Кроме того, в вашем файле YAML обязательно используйте объявление !! omap (и массив хэшей). Пример времени!
# config.yml #
months: !!omap
- january: enero
- february: febrero
- march: marzo
- april: abril
- may: mayo
Вот как выглядит этот Ruby.
# loader.rb #
require 'yaml'
require 'active_support/ordered_hash'
# Load up the file into a Hash
config = File.open('config.yml','r') { |f| YAML::load f }
# So long as you specified an !!omap, this is actually a
# YAML::PrivateClass, an array of Hashes
puts config['months'].class
# Parse through its value attribute, stick results in an OrderedHash,
# and reassign it to our hash
ordered = ActiveSupport::OrderedHash.new
config['months'].value.each { |m| ordered[m.keys.first] = m.values.first }
config['months'] = ordered
Я ищу решение, которое позволило бы мне рекурсивно копаться в Hash
, загруженном из файла .yml
, искать эти YAML::PrivateClass
объекты и преобразовывать их в ActiveSupport::OrderedHash
. Я могу опубликовать вопрос по этому вопросу.