Я использую Rails 3 и библиотеку Highcharts JS для создания диаграмм. И установка работает просто отлично. Единственная проблема заключается в том, что мой массив данных также включает в себя nil-data. Но позвольте мне сначала показать вам код. Следующий фрагмент определяет данные для моей Highchart.
data: <%= (30.days.ago.to_date..Date.today).map { |date| Health.total_on_weight(current_user.id, date).to_f}.compact %>
"Здоровье" - это модель, а "total_on_weight" - это метод, который определен в этой модели:
def self.total_on_weight(id, date)
where("user_id = ?", id).where("date(date) = ?",date).average(:weight) unless self.nil?
end
Как видите, я уже пытался создать массив, который содержит только существующие данные. Если в моей базе данных нет записи на эту дату, она не должна быть в массиве, но на самом деле это так.
Я уже пытался удалить эти записи с помощью метода "compact" и метода "never" в моей функции. Но, похоже, есть еще одна проблема, которую я не могу обернуть.
Если бы кто-нибудь мог объяснить мне, почему nil-записи все еще находятся в моем массиве или будут иметь решение, я был бы очень благодарен.
Хорошо, я сузил проблему:
Если я оставлю "to_f" в функции, как сейчас, то compact не может стереть пропущенные значения, потому что они не ноль, а 0. И массив выглядит так:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 100.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 90.0]
Затем, если я пропущу "to_f", функция "compact" может успешно удалить пропущенные значения, что даст мне массив, подобный этому:
[100.0, 100.0, 100.0, 90.0]
Но недостатком этого является то, что Highcharts больше не имеет правильных дат для моих значений. Они отображаются так, как я хотел, но даты не имеют никакого смысла.
UPDATE:
Мне удалось решить проблему самостоятельно. Данные теперь определяются как:
data: [
<% @weights = Health.where("user_id = ?", current_user.id) %>
<% @weights.each do |weight| %>
<%= "[Date.UTC(" + weight.date.year.to_s + ", " + ( weight.date.month - 1 ).to_s + ", " + weight.date.day.to_s + ")" + ", " + weight.weight.to_f.round(2).to_s + " ],"%>
<% end %>
]
Это определенно помогает.