Mostra tutte le versioni dei singoli record in Papertrail
-
11-12-2019 - |
Domanda
Sto costruendo un sistema di campionato e attualmente memorizza e aggiorna e aggiorna il punteggio Elo dei giocatori a seconda del risultato. Ora, sto cercando di aggiungere 'Highcharts' per visualizzare i giocatori Elo Punteggio sopra la stagione in un grafico a linee dolci. Qualcuno ha suggerito di utilizzare Papertrail per memorizzare gli aggiornamenti e ho ricevuto tutto il possibile.
Ora qui viene il mio problema, non riesco a capire come sputare le versioni Elo_Score degli utenti in un array facile per 'HighCharts' da usare. Posso ottenere gli ultimi aggiornamenti a Elo_Score:
Last updated score = <%= @player.versions.last.reify.elo_score %>
.
Ma non riesco a trovare la sintassi per sputare Tutto Le "Versioni" per "Elo_Score". Qualcosa come "1000, 1020, 1043, 1020".
Ho anche provato:
.
<%= @player.versions.map { |version| version.reify.elo_score} %>
Ma questo mi dà "metodo indefinito" Elo_score "per Nil: Nilclass". Mentre solo <%= @ player.versions.map {| versione | Versione.Redifica%> Sputa Tutte le informazioni nel record e ovviamente non solo l'Elo_Score.
Qualcuno può aiutare? Scusa se non ho reso questo chiaro, sono assoluto di zecca nuovi per le rotaie, e questo è solo un progetto divertente nel mio tempo libero ma sto facendo un esplosione!
Grazie Alot!
Soluzione
Cosa hai fatto qui:
@player.versions.map { |version| version.reify.elo_score }
.
è perfettamente bello prendere tutti quei punteggi e metterli in un array. Il problema che stai ottenendo (la roba nil:NilClass
) sta arrivando perché almeno un reify
è nil. Cioè, che qualche versione non ha un reify.
Se ogni versione dovrebbe avere un reify, assicurarsi di aggiungere che come convalida del modello e trovare nel tuo codice in cui viene impostato il reify e vedere perché è NIL.
Se va bene per una versione ad avere un nil reify, potresti eseguirlo un certo numero di modi, ma il modo semplice ed esplicito sarebbe simile a questo:
elo_scores = []
@player.versions.each do |version|
unless version.reify.nil?
elo_scores << version.reify.elo_score
end
end
.
Ti suggerirei di metterlo in un metodo, come get_elo_scores
, e poi puoi chiamarlo più facilmente come:
@player.get_elo_scores
.
Modifica per chiarimenti dai commenti:
Il tuo modello utente (o modello del lettore, qualunque cosa tu lo denominato) dovrebbe avere un metodo che assomiglia a questo:
.
def get_elo_scores
elo_scores = []
self.versions.each do |version|
unless version.reify.nil?
elo_scores << version.reify.elo_score
end
end
return elo_scores
end
Mi scuso per non averlo reso più chiaro, ma non avrai accesso a @player
all'interno di questo metodo perché ciò esiste solo nel contesto del controller e della visualizzazione. Quanto sopra è ora un metodo di istanza appropriato: chiamerà .versions
su se stesso e il resto va bene. Ho anche aggiunto una chiamata di ritorno esplicita alla fine.
Ora sarai in grado di chiamare @player.get_elo_scores
su qualsiasi oggetto utente (o giocatore).
Spero che ti aiuti!