2013-09-27 3 views
3

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

Для этого я собираюсь создать ряд дат, начиная с сегодняшнего дня и заканчивая 14-м днем ​​(назад во времени), чтобы повторить с .each в представлении.

most_recent = Date.current 
least_recent = Date.current.ago(14.days) 

Это не работает:

most_recent..least_recent.each 

И это не похоже на работу:

(most_recent).downto(least_recent).each 

Любые идеи, как это сделать?

ответ

4

Попробуйте это:

14.times do |i| 
    date = Date.today-i 
    #do stuff with date 
end 
+0

G.e.n.i.u.s ...! –

+2

Ответ Stefan более изящный :-) – Arkan

8

Я хотел бы использовать Numeric#ago:

14.downto(0) do |i| 
    date = i.days.ago 
end 

Вы попытки не получилось, потому что most_recent больше least_recent (я использую целые числа здесь, но это то же для дат):

(0..-14).to_a  #=> [] 
-14.downto(0).to_a #=> [] 

Эти методы работают только "fr ом от низкого до высокого ":

(-14..0).to_a  #=> [-14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0] 
0.downto(-14).to_a #=> [-14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0] 
+0

Я не использовал 'days.ago' в прошлом, потому что я читал, что он имеет более высокую нагрузку на сервер - или это только случай для' time_ago_in_words'? – dax

+0

@Stefan Это метод Rails? :) –

+1

@dax у него нет накладных расходов. '14.days' возвращает' 1209600' (количество секунд) и '1209600.ago' просто возвращает' Time.current - 1209600' – Stefan

5

Как это с помощью Date#downto?

require 'date' 

dt = Date.today 
dt.downto(dt-5){|d| puts d } 

выход:

2013-09-27 
2013-09-26 
2013-09-25 
2013-09-24 
2013-09-23 
2013-09-22 
+1

+1 для ответа :) –

0
((Date.today - 14)...(Date.today)).reverse_each do |d| 
    # YOUR CODE GOES HERE.. puts d 
end 
+0

Вам нужно «отменить» массив: * «начиная с сегодняшнего дня и заканчивая на 14-й день» * – Stefan

+0

Ahh .. I пропустил это .. Я сделаю это сейчас .. Thanx –

+2

Используйте это '((Date.today - 14) ... (Date.today)). reverse_each' ... –

3

Существует также step method; шаг с -1 возвращается во времени.

require 'date' 
most_recent = Date.today 
least_recent = most_recent - 14 
most_recent.step(least_recent, -1){|d| puts d} 
#=> 2013-09-27 
#=> 2013-09-26 
#=> 2013-09-25 
#=> 2013-09-24 
#=> 2013-09-23 
#=> ... 
+0

'downto (мин) {| дата | ...} 'эквивалентно' step (min, -1) {| date | ...} ':) Но мне нравится ваш подход к ... :) Итак, у вас есть мой .. * + 1 * .. –

Смежные вопросы