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