Я хочу создать искровые линии, которые иллюстрируют количество сообщений, созданных в моем блоге за последние 2 недели. Для этого мне нужно сначала создать массив, который содержит количество сообщений, созданных в каждый день в течение рассматриваемого периода.Получить массив, содержащий количество сообщений, созданных за последние 2 недели
Например, этот массив:
[40, 18, 0, 2, 39, 37, 22, 25, 30, 60, 36, 5, 2, 2]
генерирует этот спарклайн: (Я использую Googlecharts wrapper around the Google Charts API)
Мой вопрос заключается в том, чтобы создать эти массивы. Вот что я делаю сейчас: (я использую Searchlogic делать запросы, но это должно быть понятно, даже если вы никогда не использовали его)
history = []
14.downto(1) do |days_ago|
history.push(Post.created_at_after((days_ago + 1).day.ago.beginning_of_day).created_at_before((days_ago - 1).days.ago.beginning_of_day).size)
end
Этот подход некрасиво и медленно - там должны быть лучшим способом!
+1 для краткости. –
Часть создания массива немного уродлива, хотя, если бы не возможность 0s, вы могли бы сделать все это в одной строке: 'Post.count (: conditions => ['created_at> =? ', 14.days.ago],: group => "DATE (created_at)"). Sort_by {| i | . Я [0]} карта {| я | я [1]} '. Есть ли способ получить вызов 'Post.count' для сопоставления дней до нуля, когда в этот день не было создано сообщений? –
Невозможно сделать это, не сообщив базе данных о последовательности дат, которые вас интересуют, и ради простоты и скорости я не думаю, что было бы разумно идти по этому маршруту. Я пытался сохранить часть вашего кода, но вы можете очистить массив-идентификацию: 'counts_array = (1..14) .to_a.reverse.map {| d | counts [d.days.ago.to_date.to_s] || 0} '. –