请帮我处理这个Ruby代码

请帮我处理这个Ruby代码,ruby,refactoring,Ruby,Refactoring,我是Ruby新手,我知道我没有使用Ruby中简单而强大的方法。我让我的代码工作,但它必须是简单的,而不是这么大(特别是我觉得我在循环变量方面非常糟糕) 您可以取消计数器变量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_an

我是Ruby新手,我知道我没有使用Ruby中简单而强大的方法。我让我的代码工作,但它必须是简单的,而不是这么大(特别是我觉得我在循环变量方面非常糟糕)


您可以取消计数器变量
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

没有什么特别针对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起一个有用的名字。i和j没有太大意义。

我们可以去掉
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

嘿,伙计,谢谢!!看起来比我的好多了!!
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