2017-01-22 4 views
0

Я хочу создать массив хэшей. Но проблема в том, что после первой итерации, когда код переходит к следующей строке, он напрямую заменяет содержимое массива.Массив хешей - это переопределение данных непосредственно в массив

@item_name =[] 
item = {} 
@invoiceinfo.each do |invoice| 
    item[:name] = Invoiceinfo.find(@invoiceinfo.id).item.name 
    item[:desc] = Invoiceinfo.find(@invoiceinfo.id).desc 
    item[:unit_price] = Invoiceinfo.find(@invoiceinfo.id).unit_price 
    byebug 
    @item_name.push (item) 
end 

Это то, что я получаю после первой итерации Предположим, у меня есть эти данные

@item_name = [{:name=>"usman", :desc=>"sample ", :unit_price=>100}] 

Как только следующая строка выполняется непосредственно изменяет @item_name (имя переменной) После выполнения item[:name] = Invoiceinfo.find(@invoiceinfo.id).item.name содержание @item_name изменено

@item_name = [{: Имя => "next_name",: убывание => "образец",: unit_price => 100}]

Любая помощь будет оценена. Thannks

+0

Есть хороший ответ, но для выяснения того, что вы делаете неправильно, вы просто переопределяете значение на одни и те же ключи снова и снова. – OneNeptune

ответ

4

Попробуйте что-то вроде этого

@item_name = [] 
@invoiceinfo.each do |invoice| 
    invoice_info = Invoiceinfo.find(@invoiceinfo.id) 

    item = {} 
    item[:name] = invoice_info.item.name 
    item[:desc] = invoice_info.desc 
    item[:unit_price] = invoice_info.unit_price 

    @item_name.push(item) 
end 
+0

Спасибо, я не повторил инициализацию хэша. –

+0

Точно. И я сделал один SQL-запрос для итерации, а не три :). Добро пожаловать – Ursus

+0

Приятно видеть, что вы предоставили третью строку кода в качестве бонуса. –

4

Если вы считаете, используя рубин парадигм и лучшие практики в рубиновой коде эта ошибка не будет происходить в будущем.

@item_name = @invoiceinfo.each_with_object([]) do |invoice, acc| 
    invoice_info = Invoiceinfo.find(@invoiceinfo.id) 

    acc.push(
    name: invoice_info.item.name, 
    desc: invoice_info.desc 
    unit_price: invoice_info.unit_price 
) 
end 
+0

Экономичный и читается очень хорошо. –

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

  • Нет связанных вопросов^_^