2017-01-26 5 views
0

Я пытаюсь сделать вложенную (и, таким образом, отсортированный) массив хэшей, как так:Rails: сделать вложенную хэш-массив типа объектов

[{ stack: 'stack name', id: 1, 
    boxes: [{ 
     box: 'whatever box', 
     id: 1, 
     vars: [{ 
     var: 'some name', 
     id: 22, 
     }, 
     { var: 'another name', 
     id: 4 
     }] 
    }, { 
     box: 'another box', 
     id: 99, 
     vars: [{ 
     var: 'another', 
     id: 999 
     }] 
    }  
    }] 
}] 

Метод, который я придумал до сих пор является это который не работает, но я полностью складываю о том, как гнезде эти объекты, чтобы сохранить их иерархию (а Stack может иметь много Boxes, Box может иметь много TemplateVariables.

master = [] 
@template.stacks.alphabetised.each_with_index do |stack, i| 
    master << { stack: stack.name, id: stack.id } 
    stack.boxes.indexed.each_with_index do |box, j| 
    master[i] = { box: box.name, id: box.id } 
    box.template_variables.indexed.each do |var| 
     master[i][j] = { var: var.name, id: var.id } 
    end 
    end 
end 
master 

Это кажется не возвращать ничего, несмотря на то, что те объекты определенно находятся (и я знаю, что моя структура тоже выключена). Я делаю что-то неправильно?

+0

Синтаксис не подходит для первого. –

ответ

1

Вы можете использовать вложенные map S:

################################################ 
# Initialization code. Different from yours. 
def stacks 
    Array.new(2){|i| "Stack #{i+1}"} 
end 

@box_id = 0 
def boxes 
    Array.new(2){ "Box #{@box_id += 1}"} 
end 

@var_id = 0 
def vars 
    Array.new(2){ "Var #{@var_id += 1}"} 
end 
################################################ 

stack_data = stacks.map.with_index do |stack,i| 
    box_data = boxes.map.with_index do |box,j| 
    var_data = vars.map.with_index do |var,k| 
     {var: var, id: k} 
    end 
    {box: box, id: j, vars: var_data} 
    end 
    {stack: stack, id: i, boxes: box_data} 
end 

require 'pp' 
pp stack_data 

Это выходы:

[{:stack=>"Stack 1", 
    :id=>0, 
    :boxes=> 
    [{:box=>"Box 1", 
    :id=>0, 
    :vars=>[{:var=>"Var 1", :id=>0}, {:var=>"Var 2", :id=>1}]}, 
    {:box=>"Box 2", 
    :id=>1, 
    :vars=>[{:var=>"Var 3", :id=>0}, {:var=>"Var 4", :id=>1}]}]}, 
{:stack=>"Stack 2", 
    :id=>1, 
    :boxes=> 
    [{:box=>"Box 3", 
    :id=>0, 
    :vars=>[{:var=>"Var 5", :id=>0}, {:var=>"Var 6", :id=>1}]}, 
    {:box=>"Box 4", 
    :id=>1, 
    :vars=>[{:var=>"Var 7", :id=>0}, {:var=>"Var 8", :id=>1}]}]}] 
+0

Это _awesome_, спасибо! –