2012-03-16 3 views
3

Я полный рабочий день разработчик базы данных SQL Server, но я хочу начать использовать Ruby для определенных задач управления. Кроме того, я пытаюсь перенести свои навыки Rails на следующий уровень. Я отлично справляюсь с SQL, но слабый в языках программирования (я прилагаю все усилия, чтобы исправить это!). Вот мой вопрос:Как добавить 15 минут к дате в Ruby только между определенными часами дня?

Я хочу написать простой цикл, который будет засеять мою базу данных для приложения rails для модели встреч. Я хочу начать с даты понедельника (скажем, 19 марта 2012 г.), и я хочу закончить с датой в пятницу (23 марта 2012 г.). Я хочу начать с 9 утра каждый день, и я хочу закончить в 5 вечера каждый день. Я хочу, чтобы мои встречи проходили через 15 минут.

В настоящее время у меня есть простой цикл, который добавит 15 минут к разобранному времени. Тем не менее, я хочу добавить 15 минут только между часами 9 утра и 5 вечера каждый день. Вот мой код до сих пор:

s = Time.parse("March 19, 2012, 9:00 AM") 
e = Time.parse("March 23, 2012 5:00 PM") + 15 * 60 

while s < e 
    puts "#{s} " 
    s+=15 * 60 
end 

У меня есть идеальный список дат из приведенного выше кода (хотя я знаю, что, вероятно, гораздо лучший способ сделать это), но, как я сказал, я хочу, чтобы ограничить свои чтобы я не засевал свою таблицу базы данных кучей бесполезных дат, с которыми мне постоянно приходится иметь дело в моем приложении Rails.

Любые советы были бы весьма полезными. Заранее спасибо за вашу помощь!

+0

Не было бы лучше просто список с шагом минут 15 между 9AM и 5PM? Когда пользователь выбирает 10AM, система займет 60 минут из списка, а затем установите время там? Сколько дней вы смотрите на добавление? Не похоже, что вам нужно заполнить таблицу со списком в 15 минут. – kobaltz

+0

Ваш код устанавливает, а затем игнорирует 's'. Лучшее описание того, что вы пытаетесь выполнить, поможет. – jdl

+0

Огонь ... опечатка с моей стороны. Помогает ли это прояснить ситуацию? –

ответ

1

Я хотел бы сделать это, как это ...

Appointment.delete_all # clear table 

start_date = Time.parse("March 19, 2012, 9:00 AM") 
end_date = Time.parse("March 23, 2012 5:00 PM") 

# create a range from start_date to end_date moving in 15 minute intervals 
(start_date..end_date).step(15 * 60) do |date_time| 
    # only create Appointment if the hour is in the range 9 - 17 (24 hour clock) 
    Appointment.create(:appt => date_time) if (9..17) === date_time.hour 
end 

Альтернативные версии рубин 1.9.3

curr_time = start_date 
begin 
    Appointment.create(:appt => curr_time) if (9..17) === curr_time.hour  
end while (curr_time += 60 * 15) <= end_date 

EDIT: Это работает для меня.

irb(main):003:0> require 'time' 
=> true 
irb(main):004:0> start_date = Time.parse("March 19, 2012, 9:00 AM") 
=> Mon Mar 19 09:00:00 -0400 2012 
irb(main):005:0> end_date = Time.parse("March 23, 2012 5:00 PM") 
=> Fri Mar 23 17:00:00 -0400 2012 
irb(main):006:0> (start_date..end_date).step(15 * 60) do |date_time| 
irb(main):007:1* puts date_time 
irb(main):008:1> end 
Mon Mar 19 09:00:00 -0400 2012 
Mon Mar 19 09:15:00 -0400 2012 
Mon Mar 19 09:30:00 -0400 2012 
Mon Mar 19 09:45:00 -0400 2012 
Mon Mar 19 10:00:00 -0400 2012 
Mon Mar 19 10:15:00 -0400 2012 
Mon Mar 19 10:30:00 -0400 2012 
. 
. 
. 
Fri Mar 23 15:45:00 -0400 2012 
Fri Mar 23 16:00:00 -0400 2012 
Fri Mar 23 16:15:00 -0400 2012 
Fri Mar 23 16:30:00 -0400 2012 
Fri Mar 23 16:45:00 -0400 2012 
Fri Mar 23 17:00:00 -0400 2012 
+0

NoMethodError: undefined method 'step 'for 2012-03019 09:00:00 -0700: Время – dbenhur

+0

или TypeError: не может быть итерации с Time с диапазоном в качестве приемника – dbenhur

+0

Какой рубин вы используете? Свежая сборка ruby-1.9.3-p125 обеспечивает «TypeError: не может повторяться с момента времени» при выполнении вашего кода выше. – dbenhur

1

Я думал, что #step устроило бы это просто отлично, потом попробовал и обнаружил, что объекты времени в Ruby не реагируют на #step, как сделать Числовые.

Это хороший идиомы, так что я смешал в:

MIN = 60 
HR = 60 * MIN 
DAY = 24 * HR 

start_date = Time.mktime(2012,3,19,0,0,0) 
end_date = Time.mktime(2012,3,23,0,0,0) 

start_time = 9 * HR 
end_time = 17 * HR 
interval = 15 * MIN 

module TimeStep 
    def step(end_time, incr) 
    t = self 
    while t <= end_time 
     yield t 
     t += incr 
    end 
    end 
end 

start_date.extend(TimeStep).step(end_date, DAY) do |day| 
    first_time = day + start_time 
    first_time.extend(TimeStep).step(day+end_time, interval) do |tick| 
    # make record for tick, or just print it for this example 
    puts tick 
    end 
end 

# Outputs... 
Mon Mar 19 09:00:00 -0700 2012 
Mon Mar 19 09:15:00 -0700 2012 
Mon Mar 19 09:30:00 -0700 2012 
... 
Fri Mar 23 16:45:00 -0700 2012 
Fri Mar 23 17:00:00 -0700 2012 
+1

-1 переключение обезьян, когда вам нужно всего несколько строк кода. Умный, но не рекомендуется для человека, нового для рубинов. – Kyle

+0

ok, больше не обезьяна с глобальными классами. :) – dbenhur

+0

Да, это немного над моей головой, но это, безусловно, сработало, когда я ее запустил. Мне по-прежнему нравится простота предыдущего ответа, но на этот раз я собираюсь идти. Спасибо за вашу помощь! –

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