Frage

Ich baue ein Ligasystem auf und derzeit speichert und aktualisiert es den Elo-Score der Spieler abhängig vom Ergebnis.Jetzt versuche ich, „HighCharts“ hinzuzufügen, um die Elo-Punktzahl der Spieler im Verlauf der Saison in einem hübsch aussehenden Liniendiagramm anzuzeigen.Jemand hat mir vorgeschlagen, Papertrail zum Speichern der Updates zu verwenden, und ich habe alles installiert.

Jetzt kommt mein Problem: Ich kann anscheinend nicht herausfinden, wie ich die elo_score-Versionen der Benutzer in einem Array ausspucken kann, das für „HighCharts“ einfach zu verwenden ist.Ich kann die letzten Updates zu elo_score erhalten:

Last updated score = <%= @player.versions.last.reify.elo_score %> 

Aber ich kann anscheinend die Syntax nicht finden, die ich ausspucken kann alle die „Versionen“ für „elo_score“.Etwas wie „1000, 1020, 1043, 1020“.

Ich habe auch versucht:

<%= @player.versions.map { |version| version.reify.elo_score} %>

Aber das gibt mir „undefinierte Methode ‚elo_score‘ für nil:NilClass“.Während nur <%= @Player.version.map {| Version | Version.agier %> spuckt aus alle Informationen im Datensatz und natürlich nicht nur der elo_score.

Kann jemand helfen?Tut mir leid, wenn ich das nicht klargestellt habe, ich bin absoluter Rail-Neuling und das ist nur ein lustiges Projekt in meiner Freizeit, aber ich habe eine Menge Spaß!

Vielen Dank!

War es hilfreich?

Lösung

Was Sie hier gemacht haben:

@player.versions.map { |version| version.reify.elo_score }

Es ist vollkommen in Ordnung, alle diese Ergebnisse zu nehmen und in einem Array zusammenzufassen.Das Problem, das Sie bekommen (das nil:NilClass Zeug) kommt, weil mindestens einer reify ist gleich Null.Das heißt, dass einige Versionen kein Reify haben.

Wenn jede Version über ein Reify verfügen soll, fügen Sie dieses unbedingt als Modellvalidierung hinzu und suchen Sie in Ihrem Code, wo das Reify festgelegt wird, und sehen Sie, warum es Null ist.

Wenn es für eine Version in Ordnung ist, ein Null-Reify zu haben, können Sie dies auf verschiedene Arten erreichen, aber die direkte und explizite Methode würde so aussehen:

elo_scores = []
@player.versions.each do |version|
    unless version.reify.nil?
        elo_scores << version.reify.elo_score
    end
end

Ich würde vorschlagen, dies in eine Methode einzubauen, z get_elo_scores, und dann könnte man es einfacher so nennen:

@player.get_elo_scores

BEARBEITEN Zur Klarstellung aus den Kommentaren:

Ihr Benutzermodell (oder Player-Modell, wie auch immer Sie es nennen) sollte eine Methode haben, die so aussieht:

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

Es tut mir leid, dass ich das nicht klarer dargelegt habe, aber Sie haben keinen Zugriff darauf @player innerhalb dieser Methode, da diese nur im Kontext Ihres Controllers und Ihrer Ansicht existiert.Das Obige ist nun eine richtige Instanzmethode:es wird anrufen .versions auf sich selbst, und der Rest ist in Ordnung.Ich habe am Ende auch einen expliziten Rückruf hinzugefügt.

Jetzt können Sie anrufen @player.get_elo_scores auf jedem Benutzer- (oder Spieler-) Objekt.

Hoffentlich hilft das!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top