Как отклонить элемент из массива? - PullRequest
1 голос
/ 27 декабря 2011

Я включаю Highcharts в свой проект Rails 3 / Ruby 1.8.7, используя в качестве отправной точки эпизод с Railscast 223.

Я пытаюсь составить график массы тела пользователя за предыдущие четыре недели.Бывают дни, когда пользователь не может ввести свой вес, и я хочу, чтобы график пропустил эти даты.

Я пытался использовать ответ на этот вопрос Stackoverflow:

Highcharts - RailsВ массиве содержатся пустые записи дат

, но у меня возникла та же проблема, о которой упоминал 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_onиз модели Weight:

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 ]

1 голос
/ 27 декабря 2011

Я бы реструктурировал код, используя нерегулярные интервалы, вместо того, чтобы ожидать, что пользователи будут заполнять значения каждый день.

Создание пар даты и времени (в миллисекундах) и значений, т. Е. Массив для каждой точки со значениями 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 голос
/ 27 декабря 2011

Не следует отклонять значения из массива, оставляйте их как nil (чтобы они были позже null в JSON). Также используйте 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)
0 голосов
/ 27 декабря 2011

Изменить 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?). Таким образом, будут показаны только даты с данными о весе.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...