2010-10-09 9 views
1

J'ai ce code here et il fonctionne, mais il doit y avoir une meilleure façon ..... i besoin de deux tableaux qui ressemblent à ceIl doit y avoir un propre façon de le faire

[ 
{ 
    "Vector Arena - Auckland Central, New Zealand" => { 
    "2010-10-10" => [ 
     "Enter Sandman", 
     "Unforgiven", 
     "And justice for all" 
    ] 
    } 
}, 
{ 
    "Brisbane Entertainment Centre - Brisbane Qld, Austr..." => { 
    "2010-10-11" => [ 
     "Enter Sandman" 
    ] 
    } 
} 
] 

un pour le passé et l'autre pour le prochain ... le problème que j'ai est que je me répète et si cela fonctionne, je veux nettoyer ... voici mon data ..

+0

Comment est-ce différent de votre dernière question http: //stackoverflow.com/questions/3891231/how-do-i-create-this-multidemsional- array-hash-combo –

+0

son différent parce que j'ai besoin de briser cela maintenant en deux tableaux et je ne veux pas reproduire la logique si je peux l'aider – Trace

+0

@KandadaBoggu - aussi j'apprécie votre réponse à la question précédente .. merci beaucoup – Trace

Répondre

1

Essayez ceci:

h = Hash.new {|h1, k1| h1[k1] = Hash.new{|h2, k2| h2[k2] = []}} 
result, today = [ h, h.dup], Date.today 

Request.find_all_by_artist("Metallica", 
:select => "DISTINCT venue, showdate, LOWER(song) AS song" 
).each do |req| 
    idx = req.showdate < today ? 0 : 1 
    result[idx][req.venue][req.showdate] << req.song.titlecase 
end 

Remarque 1

Dans la première ligne, j'initialise un hachage de hachages. Le hachage externe crée le hachage interne lorsqu'une clé non existante est accédée. Un extrait de Ruby Hash documentation:

If this hash is subsequently accessed by a key that doesn‘t correspond to a hash 
entry, the block will be called with the hash object and the key, and should 
return the default value. It is the block‘s responsibility to store the value in 
the hash if required. 

Le hachage interne crée et tableau vide lorsque la date non existante est accessible.

Par exemple: Construire un hachage contenant du contenu en tant que valeurs et date clés:

Sans bloc par défaut:

h = {} 
list.each do |data| 
    h[data.date] = [] unless h[data.date] 
    h[data.date] << data.content 
end 

Avec un bloc par défaut

h = Hash.new{|h, k| h[k] = []} 
list.each do |data| 
    h[data.date] << data.content 
end 

deuxième ligne crée simplement un tableau avec deux éléments pour contenir les données passées et futures. Comme le passé et le présent stockent les données sous le nom Hash of Hash of Array, je duplique simplement la valeur.

deuxième ligne peut également être écrit comme

result = [ h, h.dup] 
today = Date.today 
+0

cela semble génial merci beaucoup .. mais pouvez-vous expliquer les deux premières lignes – Trace

+0

je reçois cela bien ActiveRecord :: MissingAttributeError: attribut manquant: chanson – Trace

+0

Mise à jour ma réponse jetez un coup d'oeil. –