2017-01-22 3 views
0

Je souhaite créer un tableau de hachages. Mais le problème est après la première itération lorsque le code passe à la ligne suivante, il remplace directement le contenu du tableau.Un tableau de hachages remplace les données directement dans le tableau

@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 

C'est ce que je reçois après la première itération suppose que j'ai ces données

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

Dès que la ligne suivante est exécutée, elle @item_name change directement (variable nom) Après l'exécution item[:name] = Invoiceinfo.find(@invoiceinfo.id).item.name le contenu du @item_name est modifié

@item_name = [{: name => "next_name",: desc => "échantillon",: unit_price => 100}]

Toute aide serait appréciée. Thannks

+0

Il y a une bonne réponse, mais de clarifier ce que vous faites mal, vous êtes juste réaffectant la valeur aux mêmes touches plus et plus. – OneNeptune

Répondre

4

Essayez quelque chose comme ça

@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

Merci, je ne réinitialisais pas le hachage. –

+0

Exactement. Et j'ai fait une requête SQL pour l'itération, pas trois :) Vous êtes les bienvenus – Ursus

+0

Bon de vous voir fourni la troisième ligne de code en bonus. –

4

Si vous envisagez d'utiliser des paradigmes de rubis et les meilleures pratiques dans le code Ruby, cette erreur ne se produira pas à l'avenir.

@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

Économique et lit très bien. –