Morris.js 如何为特定类型创建图表
Morris.js how to create graph for specific type
我在使用 Morris.js 库创建图形时遇到了一些问题。我创建了运动应用程序,每次训练都有一些价值。其中之一是 "workout" 表示锻炼类型("Running","Swimming","Cycling").我想显示带有日期和距离的折线图,但对于特定类型的训练,例如 "Running"。我创建了包含所有日期和距离的通用图表,但是当我尝试为特定类型制作图表时,它不会显示正确的图表,而是显示每天所有 运行 距离之和的图表(水平线)。我不知道如何修复 workouts_helper.rb distance: 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} %>
distance
是您的 Workout
table 中的一个列,还是您的 Workout
模型中的一个方法?
如果是列:
Workout
.where(workout: 'Running')
.sum(:distance)
应该可以正常工作。
如果它是一种方法,您需要执行以下操作:
Workout
.where(workout: 'Running')
.to_a
.sum(&:distance)
或
Workout
.where(workout: 'Running')
.sum{ |w| w.distance }
还值得注意的是,查询将为您范围内的每个日期return 相同的结果集。如果这是您真正想要的,将查询移到迭代之外可能是有意义的:
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
回顾你的问题,我怀疑你的问题可能是你没有在 distance
计算中考虑 date
。
您可能需要为 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
我在使用 Morris.js 库创建图形时遇到了一些问题。我创建了运动应用程序,每次训练都有一些价值。其中之一是 "workout" 表示锻炼类型("Running","Swimming","Cycling").我想显示带有日期和距离的折线图,但对于特定类型的训练,例如 "Running"。我创建了包含所有日期和距离的通用图表,但是当我尝试为特定类型制作图表时,它不会显示正确的图表,而是显示每天所有 运行 距离之和的图表(水平线)。我不知道如何修复 workouts_helper.rb distance: 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} %>
distance
是您的 Workout
table 中的一个列,还是您的 Workout
模型中的一个方法?
如果是列:
Workout
.where(workout: 'Running')
.sum(:distance)
应该可以正常工作。
如果它是一种方法,您需要执行以下操作:
Workout
.where(workout: 'Running')
.to_a
.sum(&:distance)
或
Workout
.where(workout: 'Running')
.sum{ |w| w.distance }
还值得注意的是,查询将为您范围内的每个日期return 相同的结果集。如果这是您真正想要的,将查询移到迭代之外可能是有意义的:
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
回顾你的问题,我怀疑你的问题可能是你没有在 distance
计算中考虑 date
。
您可能需要为 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