2016-09-18 6 views
0

Ich habe einige Probleme mit erstellen Graph mit Morris.js Bibliothek. Ich habe eine Sport-App erstellt und jedes Training hat einige Werte. Einer von ihnen ist "Training" es bedeutet Art des Trainings ("Laufen", "Schwimmen", "Radfahren"). Ich möchte Liniendiagramm mit Datum und Abstand anzeigen, aber für bestimmte Art von Training, zum Beispiel "Running". Ich habe ein allgemeines Diagramm mit allen Daten und Entfernungen erstellt, aber wenn ich versuche, ein Diagramm für einen bestimmten Typ zu erstellen, wird nicht das richtige angezeigt, sondern ein Diagramm mit der Summe aller Laufdistanzen für jeden Tag (horizontale Linie). Ich weiß nicht, wie Linie zu beheben in workouts_helper.rb Entfernung: Workout.where (Training: "Running"). Sum (: Entfernung)Morris.js wie man ein Diagramm für einen bestimmten Typ erstellt

workouts_helper.rb:

def running_chart_data 
    (3.weeks.ago.to_date..Date.today).map do |date| 
     { 
      date: date, 
      distance: Workout.where(workout: "Running").sum(:distance) 
     } 
    end 
end 

application.html.erb:

<script> 
     new Morris.Line({ 
      element: 'running_chart', 
      resize: true, 
      data: $('#running_chart').data('running'), 
      xkey: 'date', 
      ykeys: ['distance'], 
      labels: ['Distance'] 
     }); 
</script> 

index.html.erb:

<h1>Last 3 weeks running graph</h1> 

     <%= content_tag :div, "", id: "running_chart", data: {running: running_chart_data} %> 

Antwort

1

Ist distance eine Spalte in der Tabelle Workout, oder ist es eine Methode in Ihrem Workout Modell?

Wenn es eine Spalte:

Workout 
    .where(workout: 'Running') 
    .sum(:distance) 

sollte gut funktionieren.

Wenn es ein Verfahren ist, müssen Sie so etwas wie zu tun:

Workout 
    .where(workout: 'Running') 
    .to_a 
    .sum(&:distance) 

Oder

Workout 
    .where(workout: 'Running') 
    .sum{ |w| w.distance } 

Es ist auch erwähnenswert, dass die Abfrage das gleiche Ergebnis für jeden Satz zurückkehren wird Datum in Ihrem Bereich. Wenn das ist, was Sie wirklich wollen, ist es wahrscheinlich sinnvoll, die Abfrage außerhalb der Iteration wie folgt zu verschieben:

def running_chart_data 
    distance = Workout 
       .where(workout: 'Running') 
       .sum{ |w| w.distance } 

    ((Date.current - 3.weeks)..Date.current).map do |date| 
    { date: date, 
     distance: distance } 
    end 
end 

Im Rückblick auf Ihre Frage, ich vermute, dass das Problem könnte sein, dass Sie nehmen nicht date in Konto in Ihrer distance Berechnung.

Sie können einen Scheck für die date wie hinzuzufügen:

def running_chart_data 
    ((Date.current - 3.weeks)..Date.current).map do |date| 
    distance = Workout 
       .where(workout: 'Running', 
         created_at: date.beginning_of_day..date.end_of_day) 
       .sum(:distance) } 

    { date: date, 
     distance: distance } 
    end 
end 
+0

„Abstand“ ist meine Spalte. Ich habe den Helfer-Code geändert, aber jedes Mal bekomme ich eine horizontale Linie - jeden Tag habe ich eine Summe von "Running" Abstand. – Morgan

+0

Siehe das letzte Beispiel, das ich hinzugefügt habe ... denke, dass das dein Problem sein könnte. – dinjas

+1

Sie rocken dinjas;) Ich muss "created_at" zu "date" geändert haben, denn wenn ich etwas Training mit Datum aus der Vergangenheit hinzufüge, addiere es die ganze Zeit Distanz zum tatsächlichen Datum, aber es war nicht das Problem. Danke für die Hilfe :) – Morgan

Verwandte Themen