Пожалуйста, помогите мне с этим кодом Ruby - PullRequest
2 голосов
/ 07 июня 2010

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

i = 0
j = 0

loop_count = ((to_date-from_date)/(60*60*24)).to_i#diff b/w two dates in days

loop_count.times do
   48.times do

    event = Icalendar::Event.new

    status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

    if(status != 'unavailable')
      #Initialize start and end dates in DateTime's civil format
      bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)

      event.dtstart = bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
      event.dtend = event.dtstart + 30.minutes

      event.summary = status.upcase
      cal.add_event(event)
    end

    i += 1
  end
  i = 0
  j += 1
end

Ответы [ 3 ]

4 голосов
/ 07 июня 2010

Ничего особенного в Ruby, но в целом ваши методы должны быть короткими.

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

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

Что-то вроде:

0.upto(((to_date-from_date)/(60*60*24)).to_i) do |j|
  0.upto(48) do |i|
      status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

      add_event(from_date, to_date, i, j, status) if status != 'unavailable'
  end
end


def add_event(from_date, to_date, i, j, status)
      event = Icalendar::Event.new

      event.dtstart = whatever_i_am_trying_to_calculate(from_date, i, j)
      event.dtend = event.dtstart + 30.minutes
      event.summary = status.upcase

      cal.add_event(event)
end

def whatever_i_am_trying_to_calculate(from_date, i, j)
  bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)
  bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
end

Также дайте вашим переменным i и j полезные имена. я и j не очень много значим.

2 голосов
/ 07 июня 2010

Вы можете избавиться от инициализации и приращения переменных счетчика i и j следующим образом:

0.upto(((to_date-from_date)/(60*60*24)).to_i) do |j|
  0.upto(48) do |i|
    event = Icalendar::Event.new

    status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

    if(status != 'unavailable')
      #Initialize start and end dates in DateTime's civil format
      bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)

      event.dtstart = bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
      event.dtend = event.dtstart + 30.minutes

      event.summary = status.upcase
      cal.add_event(event)
    end
  end
end

Этот код на 6 строк короче вашего, ничего не поделаешькод внутри циклов, потому что я не совсем понимаю, что вы там делаете.

Обновление: Альтернатива, которая тоже работает:

((to_date-from_date)/(60*60*24)).to_i.times do |j|
  48.times do |i|
    event = Icalendar::Event.new

    status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

    if(status != 'unavailable')
      #Initialize start and end dates in DateTime's civil format
      bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)

      event.dtstart = bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
      event.dtend = event.dtstart + 30.minutes

      event.summary = status.upcase
      cal.add_event(event)
    end
  end
end
1 голос
/ 10 июня 2010

Мы можем избавиться от переменной j и избежать добавления j.days везде и использовать date

from_date.to_i.step(to_date.to_i, 24*60*60) do |date|
  0.upto(48) do |half_hour|
    each_date = Time.at(date)
    event = Icalendar::Event.new

    status = get_availability_on_date_and_hour(@templates, @availabilities, each_date, half_hour).downcase

    if(status != 'unavailable')
      #Initialize start and end dates in DateTime's civil format

      bias_date_time = DateTime.civil(each_date.year, each_date.month, each_date.day)

      event.dtstart = bias_date_time + (i/2).to_i.hour + (i%2*30).to_i.minutes
      event.dtend = event.dtstart + 30.minutes

      event.summary = status.upcase
      cal.add_event(event)
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...