Morris.js как создать график для конкретного типа

У меня есть некоторые проблемы с созданием графа с использованием библиотеки Morris.js. Я создал спортивное приложение, и у каждой тренировки есть свои ценности. Одним из них является "тренировка", то есть тип тренировки ("Бег", "Плавание", "Велоспорт"). Я хочу отобразить линейный график с датой и расстоянием, но для определенного типа тренировки, например, "Бег". Я создал общий график со всеми датами и расстояниями, но когда я пытаюсь построить график для определенного типа, он отображает не правильный, а график с суммой всех расстояний пробега за день (горизонтальная линия). Я не знаю, как исправить линию на расстоянии workouts_helper.rb : Workout.where(workout: "Running"). Sum (: distance)

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} %>

1 ответ

Решение

Является distance колонка в вашем Workout таблица, или это метод в вашем Workout модель?

Если это столбец:

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

должно работать нормально.

Если это метод, вам нужно сделать что-то вроде:

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

Или же

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

Стоит также отметить, что запрос будет возвращать один и тот же набор результатов для каждой даты в вашем диапазоне. Если это то, что вам действительно нужно, то, вероятно, имеет смысл переместить запрос за пределы итерации следующим образом:

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

Оглядываясь назад на ваш вопрос, я подозреваю, что ваша проблема может быть в том, что вы не принимаете date во внимание в вашем distance расчет.

Вы можете добавить чек для date лайк:

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
Другие вопросы по тегам