如何拒绝数组中的元素?

时间:2011-12-27 13:40:06

标签: javascript ruby-on-rails ruby ruby-on-rails-3 highcharts

我将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

看起来正在发生的事情是正在构建日期/权重数组,日期一直持续到返回权重值。然后,在迭代到下一个日期之前,将日期和权重(与数组中的日期不对应)添加到数组中。

我如何拒绝约会?如果没有找到该日期的重量值,我该如何跳过该日期,确保它没有被添加到数组中,然后继续下一个日期?

感谢您的帮助!

3 个答案:

答案 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]]
    }
});

http://www.highcharts.com/demo/spline-irregular-time

答案 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?)会拒绝这些日期。因此,只显示具有重量数据的日期。

希望这有帮助。