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
Comment est-ce différent de votre dernière question http: //stackoverflow.com/questions/3891231/how-do-i-create-this-multidemsional- array-hash-combo –
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
@KandadaBoggu - aussi j'apprécie votre réponse à la question précédente .. merci beaucoup – Trace