2012-06-01 3 views
0

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

У меня есть хэш дней в неделю:

DAYS = { 
1 => "Monday", 
2 => "Tuesday", 
3 => "Wednesday", 
4 => "Thursday", 
5 => "Friday", 
6 => "Saturday", 
7 => "Sunday"} 

(есть, вероятно, некоторые рельсы помощника для этого, но я реализовал это самый быстрый способ, которым я мог думать)

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

Вот этот массив

def day_keys 
    # proper sorting of days, start with today and then continue 
    day_array = (1..7).to_a 
    loop do 
     break if day_array.first == Time.now.wday 
     day_array.rotate! 
    end 
    day_array 
    end 

Это пятница сегодня, поэтому она возвращает [5,6,7,1,2,3,4]. После этого я сопоставляю значения из этого массива с ключами из хэша DAYS, чтобы найти имена дней.

Решение кажется довольно грубым для меня, поэтому я хотел бы услышать некоторые идеи о том, как реализовать это. Я потратил некоторое время, глядя на Array#cycle и Enumerable#inject, но ничто, похоже, не соответствует моим потребностям.

+0

Можете ли вы сказать нам, что вы пытаетесь достичь, в контексте ваше приложение? Для этого не может быть необходимости. – Agis

+0

Используется в помощнике, который отображает календарь. Мне нужен календарь в виде таблицы, которая отображает часы дня в строках и днях недели в столбцах. Я не мог найти хороших камней для этого, поэтому решил сам создать его. – shime

ответ

5

Как насчет: ((Time.now.wday)..(Time.now.wday+6)).collect{|i| ((i-1) % 7) +1}

Если вы в рельсах, у вас есть еще несколько помощников. Это дает массив дат:

((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i} 

И если вы хотите, чтобы название дня, это просто небольшая модификация

((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i.strftime "%A"} 
+0

Как насчет: «Спасибо!» – shime

+0

Можете ли вы просто изменить свой ответ на 'Time.now.wday + 6'? – shime

+0

Да, только что поймал, что, пытаясь использовать последний пример, я просто добавил ... – DGM

2

Что-то, как это будет работать ...

DAYS_HASH = { 'Mon' => 1, 
'Tue', => 2, 
'Wed', => 3, 
'Thu', => 4, 
'Fri', => 5 } 

DAYS_ARY = ['Mon','Tue','Wed','Thu','Fri'] 

def days(start) 
    DAYS_ARRAY.rotate(start-1) 
end 

дней (DAYS_HASH ['Wed'])

=> ['Wed', 'Thu', 'Fri', 'Mon', 'Tue'] 
+0

+1 Мне это нравится! Спасибо! – shime

1

, если у вас есть рубин 1.8.7

day_array.index(Time.now.wday).times do day_array.push(day_array.shift) end 

, если у вас есть рубин 1.9.2

day_array.index(Time.now.wday).times do day_array.rotate end 
1
require 'date' 
today = Date.today 
p (today..today+6).map{|day| Date::DAYNAMES[day.wday]} 
#=>["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"] 
Смежные вопросы