2017-04-08 1 views
0

Ich habe eine CLI-App, die 5 verschiedene Deal-Seiten ausschneidet und sie in @@ alle Klassenvariablen speichert. Ich möchte, dass alle von ihnen eine neue Variable haben, die von 1 bis 100 beginnen sollte (weil es insgesamt 100 Angebote gibt). Ich habe viel versucht, aber es zeigt nur die Nummer 1 für alle Angebote.Iteriere über alle Array-Elemente und füge eine Variable zum Element ruby ​​hinzu.

def deals_listing 
    all_deals = PopularDeals::NewDeals.all 
    @deals = [] 
    all_deals.collect do |deal_info| 
    i = 1 
    deal_info.number = i 
    @deals << deal_info 
    i = i + 1 
    end 
    @deals 
    binding.pry 
end 

Die Stichprobe der Ausgabe, die ich ist bin immer ..

pry(#<PopularDeals::CLI>)> @deals                                  
=> [#<PopularDeals::NewDeals:0x00000001aaf220                                
    @deal_rating="+7",                                       
    @number=1,                                         
    @posted="Posted Today",                                     
    @price="$7.64",                                       
    @title=                                         
    "Back Again at Amazon Campbell's Slow Cooker Sauces, Apple Bourbon Pulled Pork, 13 Ounce (Pack of 6) as low as $7.64 w/ Subscribe and Save S&S w/ Free Shipping",   
    @url=                                          
    "https://slickdeals.net/f/10033448-back-again-at-amazon-campbell-s-slow-cooker-sauces-apple-bourbon-pulled-pork-13-ounce-pack-of-6-as-low-as-7-64-w-subscribe-and-save-s- 
s-w-free-shipping">,                                       
#<PopularDeals::NewDeals:0x00000001a876f8                                 
    @deal_rating="+6",                                       
    @number=1,                                         
    @posted="Posted Today",                                     
    @price="$5.33",                                       
    @title=                                         
    "LUCKLED 20 LED Solar Powered Dragonfly String Lights Multi-color $5.33 AC, FS w/prime @Amazon",                   
    @url=                                          
ing-lights-multi-color-5-33-ac-fs-w-prime-amazon">,                               
#<PopularDeals::NewDeals:0x00000001a84228                                 
    @deal_rating="+6",                                       
    @number=1,                                         
    @posted="Posted Today",                                     
    @price="$339.99",                                       
    @title=                                         
ping @ Walmart",                                        
    @url=                                          
efurbished-339-99-free-shipping-walmart">,                                 
#<PopularDeals::NewDeals:0x00000001a80ad8                                 
    @deal_rating="+6",                                       
    @number=1,                                         
: 

Was würde ich gerne haben ..

pry(#<PopularDeals::CLI>)> @deals                                  
=> [#<PopularDeals::NewDeals:0x00000001aaf220                                
    @deal_rating="+7",                                       
    @number=1,                                         
    @posted="Posted Today",                                     
    @price="$7.64",                                       
    @title=                                         
    "Back Again at Amazon Campbell's Slow Cooker Sauces, Apple Bourbon Pulled Pork, 13 Ounce (Pack of 6) as low as $7.64 w/ Subscribe and Save S&S w/ Free Shipping",   
    @url=                                          
    "https://slickdeals.net/f/10033448-back-again-at-amazon-campbell-s-slow-cooker-sauces-apple-bourbon-pulled-pork-13-ounce-pack-of-6-as-low-as-7-64-w-subscribe-and-save-s- 
s-w-free-shipping">,                                       
#<PopularDeals::NewDeals:0x00000001a876f8                                 
    @deal_rating="+6",                                       
    @number=2,                                         
    @posted="Posted Today",                                     
    @price="$5.33",                                       
    @title=                                         
    "LUCKLED 20 LED Solar Powered Dragonfly String Lights Multi-color $5.33 AC, FS w/prime @Amazon",                   
    @url=                                          
ing-lights-multi-color-5-33-ac-fs-w-prime-amazon">,                               
#<PopularDeals::NewDeals:0x00000001a84228                                 
    @deal_rating="+6",                                       
    @number=3,                                         
    @posted="Posted Today",                                     
    @price="$339.99",                                       
    @title=                                         
ping @ Walmart",                                        
    @url=                                          
efurbished-339-99-free-shipping-walmart">,                                 
#<PopularDeals::NewDeals:0x00000001a80ad8                                 
    @deal_rating="+6",                                       
    @number=4,                                         
: 

Irgendwelche Vorschläge es funktioniert? Vielen Dank im Voraus.

Antwort

2

deal_info.number Wenn Sie die Eigenschaft eines Objekts füllen wollen mit seine Position innerhalb einiger Array:

@deals = PopularDeals::NewDeals.all.each_with_index.map do |deal, i| 
    deal.number = i 
    deal 
end 

die Sie holen kann, iterieren, und mit einer minimalen Menge von Chaos in einem Durchgang zu. Die each_with_index Methode gibt Ihnen einen einfachen Index für jedes Element, und map ermöglicht es Ihnen, dies in Ihr endgültiges Array zu konvertieren.

+0

Es hat auch funktioniert! Danke vielmals! –

0

Nun, dieses Problem ist gelöst. Ich habe eine Antwort bekommen. Wenn jemand anderes versucht, so etwas zu tun, habe ich das getan.

def deals 
    all_deals = PopularDeals::NewDeals.all 
    @deals = [] 
    all_deals.collect do |deal_info| 
     deal_info.number = all_deals.index(deal_info).to_i + 1 
     @deals << deal_info 
    end 
    @deals 
    end 

verwendete ich .index Methode Indexnummer zu finden und fügte man es so, es geht von 1, und es zugewiesen

+0

Dies funktioniert, aber denken Sie daran, dass 'index' progressiv langsamer wird, je größer Ihre Listen werden, so dass dies zu einer geometrischen Skalierung führt. – tadman

Verwandte Themen