2015-03-27 2 views
-1

У меня есть массив с объектами, такими как:Получить объекты в массиве

mobilephones = [[#<Phone id: 941, name: "CEO", representation_edavis_id: 172, phone_type_id: nil, number: "+12 3456789", sort_order: 13, remark: "mobile", created_at: "2015-03-05 13:27:24", updated_at: "2015-03-05 13:27:24", creator_id: nil, updater_id: nil, row_number: 941>],[#<Phone id: 946, name: "CFO", representation_edavis_id: 172, phone_type_id: nil, number: "+12 3456789", sort_order: 6, remark: "mobile", created_at: "2015-03-05 13:27:24", updated_at: "2015-03-05 13:27:24", creator_id: nil, updater_id: nil, row_number: 946>]] 

Как я могу получить имя и номер атрибута всех объектов в массиве?


Я полагаю, как правило, он должен работать, как было предложено, но в моем контексте, внутри Rails приложения, я получил сообщение об ошибке:

undefined method `name' for #<Array:0x421c188> 

По мнению _show.html.haml:

ActionView::Template::Error (undefined method `name' for #<Array:0x421c188>): 
    67: - list_mobilephones(r) 
    68: - @mobilephones.each do |phone| 
    69: %tr 
    70:  %td= phone.name 
    71:  %td= "#{phone.number} #{phone.remark}"  
    72: 

В application_helper.rb:

def list_mobilephones(rep) 
    @mobilephones = [] 
    rep.phones.each do |phone|  
     @mobilephones << [phone] if phone.remark == "mobile"  
     @mobilephones 
    end 
    end 
+0

Каков ваш ожидаемый выход? Массив хешей? Два массива? STDOUT? Еще один метод? – scones

+0

Добро пожаловать в переполнение стека. Нет необходимости сообщать нам, что вы добавили/отредактировали в вопросе. Мы можем видеть, что вы изменили, это то, что приобретают члены более высокого ранга. Вместо этого поместите информацию в поток вопроса или просто разделите новую информацию с помощью '---', а SO разместит горизонтальное правило в вопросе в этой точке. –

+0

@ Энтони, нет необходимости сообщать кому-то, что вы обновили ответ. Вот что нам сообщает временная метка редактирования. –

ответ

2

в вашем конкретном случае было бы достаточно, если вы используете flatten

@mobilephones.flatten.each do |phone| 
    -# some more code 

В зависимости от использования переменной, вам также может избежать сборки вложенного массива. Если вы используете его именно в этом месте, попробуйте это

def list_mobilephones(rep) 
    @mobilephones = [] 
    rep.phones.each do |phone|  
    @mobilephones << phone if phone.remark == "mobile"  
    @mobilephones 
    end 
end 
0

Вы просто цикл по массиву и доступа к объектам информации, например, так:

mobilephones.flatten.each do |obj| 
    puts "name: #{obj.name}, phone_number: #{obj.phone_number}" 
end