我将Highcharts合并到我的Rails 3 / Ruby 1.8.7项目中,使用Railscast第223集作为起点。
我正在尝试绘制用户在过去四周内的体重。有些日子,用户可能无法输入他们的体重,我希望图表跳过这些日期。
我尝试使用Stackoverflow问题的答案:
Highcharts - Rails array includes empty date entries
但我遇到的问题是OP提到的重量值被分配给没有条目的日期。简而言之,没有重量的日期仍然被分配给具有下一个重量值的数组。
以下是我图表系列选项中的代码:
series: [{
name: "Daily Weight",
pointInterval: <%= 1.day * 1000 %>,
pointStart: <%= 4.weeks.ago.to_i * 1000 %>,
data: <%= (4.weeks.ago.to_date..Date.today).map { |date| Weight.weight_on(date, current_user.id).to_f}.reject(&:zero?).inspect %>
}]
这是Weight模型中的weight_on函数:
def self.weight_on(date, user_id)
weight = Weight.find_by_entry_date_and_user_id(date, user_id)
unless weight.nil?
return weight.weight_entry
end
end
看起来正在发生的事情是正在构建日期/权重数组,日期一直持续到返回权重值。然后,在迭代到下一个日期之前,将日期和权重(与数组中的日期不对应)添加到数组中。
我如何拒绝约会?如果没有找到该日期的重量值,我该如何跳过该日期,确保它没有被添加到数组中,然后继续下一个日期?
感谢您的帮助!
答案 0 :(得分:1)
我会使用不规则的间隔重构代码,而不是期望用户每天填写值。
生成一对日期时间(以毫秒为单位)和值,即每个具有x和y值的点的数组。
new Highcharts.Chart({
chart: {
renderTo: 'container',
type: 'line'
},
xAxis: {
type: 'datetime',
maxZoom: 7 * 24 * 3600000, // one week
},
series: [
{
name: "Weight",
data: [[1295954580000,3.9],[1297411200000,6.6],1298366040000,5.5],1318931520000,7.7],[1320143220000,2.2],[1320846960000,5.6],[1321356600000,2.1]]
}
});
答案 1 :(得分:1)
您不应该拒绝数组中的值,将它们保留为nil
(因此它们在JSON中稍后null
。另外,请使用to_json
,而不是inspect
:
<%= date_intervals.map { |date| Weight.weight_on(date, current_user.id) }.to_json %>
更多的重构:
def self.weight_on(date, user_id)
Weight.find_by_entry_date_and_user_id(date, user_id).try(:weight_entry)
end
但无论如何你应该能够在User
对象(has_many :weights
)上执行此操作:
user.weight_on(date)
答案 2 :(得分:0)
将self.weight_on
方法更改为
def self.weight_on(date, user_id)
weight = Weight.find_by_entry_date_and_user_id(date, user_id)
if weight.nil?
return 0.0
else
return weight.weight_entry
end
end
这样做会使那些没有重量数据的日期变为return 0.0
(浮动),.reject(&:zero?)
会拒绝这些日期。因此,只显示具有重量数据的日期。
希望这有帮助。