2017-04-12 1 views
1

Je dispose d'un tableau de dates et un objet tests, qui est soumis par l'utilisateur:trouver des correspondances dans les blocs imbriqués

dates = [] 
today = Date.today + 1 
(today - 31..today).each{|date| dates.push(date.to_s)} 
tests = company.tests.where(date: today - 31..today).order(date: :asc) 

J'itérer sur chaque date, et s'il y a un test qui correspond à la Je l'ajoute à un tableau score. Il peut y avoir plusieurs, d'où le calcul average.

score = [] 
array = [] 
dates.each do |r| 
    tests.each do |t| 
    if t.date.strftime("%Y-%m-%d") == r 
     score.push(t.security_percentage) 
    end 
    end 
    average = score.reduce(:+).to_i/score.size 
    array.push(average) 
end 

Je suis coincé à essayer de comprendre comment insérer un 0 s'il n'y a pas de tests pour la date donnée. Je me attends array avoir 31 entrées:

[0, 98, 89, 99, 0, 0, ...] 

mais il a seulement 20 entrées depuis que je n'ai que 20 tests.

Répondre

0

Je suis bloqué en essayant de comprendre comment insérer un 0 s'il n'y a aucun tests pour la date donnée.

Vous pouvez pousser autant de zéros que vous devez après votre code est fait:

(1..31-array.size).each do |x| 
    array.push(0) 
end 

Cest pas joli, mais répond à la question que je suppose que


Je dois seulement les pousser s'il n'y a pas de test pour la date en cours d'itération.

Que diriez-vous celui-ci:

if t.date.strftime("%Y-%m-%d") == r 
    score.push(t.security_percentage) 
else 
    score.push(0) 
end 
+0

C'est en fait tout à fait semblable à ce que j'avais à l'origine. Le problème est que je ne peux pas remplir l'espace restant avec des zéros. Je n'ai besoin de les pousser que s'il n'y a pas de test pour la date en cours d'itération. – Godzilla74

+0

@ Godzilla74 a mis à jour le post –

+0

Donc, pousser un '0' 30+ fois dans le tableau' score' puisque les autres dates de test ne correspondent pas? – Godzilla74

0

Nous avons fini d'apprendre sur l'utilisation .select:

dates = [] 
array = [] 
today = Date.today + 1 
tests = company.tests.where(date: today - 31..today).order(date: :asc) 
(today - 31..today).each{|date| dates.push(date.to_s)} 
    dates.each do |r| 
    score = [] 
    matches = tests.select{ |t| t.date.strftime("%Y-%m-%d") == r } 
    if matches.length > 0 
     matches.each do |m| 
     score.push(m.security_percentage) 
     end 
     average = score.reduce(:+).to_i/score.size 
     array.push(average) 
    else 
     array.push(0) 
    end 
    end