Я пытаюсь написать метод, который возвращает очень специфическую структуру данных для диаграммы, которую я заполняю.
Пользователь может вводить даты пройденных миль, поэтому в модели Mile у меня есть атрибуты start_date и end_date.
В настоящее время у меня есть метод close , однако он должен возвращать 0 для текущего месяца, поскольку пользователь не набрал ни одного мили, пройденного за май. Я также должен ограничить это текущим годом, которым он в настоящее время не является.
Вот как выглядит мой текущий метод:
def miles_by_month
miles = self.miles.from_this_year.group_by { |t| t.start_date.strftime('%b') }
total_miles = miles.map do |m|
{ 'indicator': m[0], 'total': m[1].sum(&:length) }
end
total_miles
end
И область 'from_this_year' для модели Mile, если это полезно:
scope :from_this_year, lambda { where("start_date > ? AND start_date < ?", Time.now.beginning_of_year, Time.now.end_of_year) }
А вот пример того, что он возвращает:
[
[0] {
:indicator => "Jan",
:total => 15
},
[1] {
:indicator => "Feb",
:total => 10
},
[2] {
:indicator => "Mar",
:total => 10
},
[3] {
:indicator => "Apr",
:total => 100
},
[4] {
:indicator => "May", # I need [4] to show up with
:total => 0 # a total of 0. [4] currently
} # does not show up at all.
]
«Индикатор» относится к названию месяца, а «итог» относится к сумме миль, пройденных пользователем за этот конкретный месяц.
Есть предложения?
ОБНОВЛЕНИЕ 1
Я несколько изменил свой метод miles_by_month
, основанный на ответе здесь:
def miles_by_month
months = Date::ABBR_MONTHNAMES[1..12]
miles = self.miles.from_this_year.group_by { |t| t.start_date.strftime('%b') }
total_miles = miles.map do |m|
{ 'indicator': m[0], 'total': m[1].sum(&:length) }
end
months.each do |month|
unless total_miles.any? { |r| r[:indicator] == month }
total_miles.push(indicator: month, total: 0)
end
end
total_miles
end
Единственное, что мне нужно сделать, это выяснить, как ограничить переменную month от начала года до текущего месяца.