2013-11-15 7 views
1

Так что у меня этот permissionrank.yaml файл:Преобразование YAML в массив хэшей

player: 
    id: 1 
    label: Player 
    badge: NIL 

bronze helper: 
    id: 2 
    label: Bronze Helper 
    badge: STF_HELP_BRZ 

silver helper: 
    id: 3 
    label: Silver Helper 
    badge: STF_HELP_SLV 

Есть ли способ, чтобы загрузить это в массив хэшей, так что будет соответствовать один и тот же формат seeds.rb файла Rails' ? Он должен выводить:

[ 
    {id: 1, label: "Player",    badge: "NIL"  }, 
    {id: 2, label: "Bronze Helper",   badge: "STF_HLP_BRZ"}, 
    {id: 3, label: "Silver Helper",   badge: "STF_HLP_SLV"}, 
] 

Это формат файла семян Rails.

ответ

3

В вашем примере, он загружает из YAML, как:

{"player"=>{"id"=>1, "label"=>"Player", "badge"=>"NIL"}, 
"bronze helper"=>{"id"=>2, "label"=>"Bronze Helper", "badge"=>"STF_HELP_BRZ"}, 
"silver helper"=>{"id"=>3, "label"=>"Silver Helper", "badge"=>"STF_HELP_SLV"}} 

Так все, что вам на самом деле, кажется, нужно избавиться от того, является хэш-ключи. Если вы хотите сохранить значения хэш-, вы можете использовать метод Hash#values получить (почти) массив вы хотите:

pp YAML.load_file("permissionrank.yml").values 

[{"id"=>1, "label"=>"Player", "badge"=>"NIL"}, 
{"id"=>2, "label"=>"Bronze Helper", "badge"=>"STF_HELP_BRZ"}, 
{"id"=>3, "label"=>"Silver Helper", "badge"=>"STF_HELP_SLV"}] 

Единственная оставшаяся разница с вашим примером является то, что ключи внутри этих хэшей это строки, а не символы. Это, вероятно, не имеет значения, так как Rails, как правило, очень расслаблен в этом отношении, но, ради примера, давайте также преобразуем их. Для этого вы можете использовать метод Hash#symbolize_keys из ActiveSupport.

pp YAML.load_file("permissionrank.yml").values.map(&:symbolize_keys) 

[{id: 1, label: "Player", badge: "NIL"}, 
{id: 2, label: "Bronze Helper", badge: "STF_HELP_BRZ"}, 
{id: 3, label: "Silver Helper", badge: "STF_HELP_SLV"}] 
+0

Спасибо, я попробую это, когда вернусь к своему компьютеру. –

+0

Спасибо, что работает, как вы сказали. Я добавил пример кода, который я тестировал на ваш пост для полноты, не могли бы вы принять его, чтобы я мог принять ваш ответ? :) –

+0

Боюсь, я еще не достиг статуса модерации, но я уверен, что модератор скоро придет. –

Смежные вопросы