2010-06-07 85 views
2

我是Ruby的新手,我知道我没有使用其中的简单而强大的方法。我做了我的代码工作,但它必须是简单的不是这个巨大的(尤其是我觉得我很不好,在循环变量)请帮我使用这个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 

回答

2

可以摆脱计数器变量的初始化和递增的ij像这样的:

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 
+0

嘿,伙计,谢谢!看起来比我的好多了.. !! – bragboy 2010-06-07 15:20:09

4

没有什么特别具体的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 

也给你的变量我和j有用的名字。我和j并不是很重要。

1

我们可以摆脱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 
+0

谢谢Mr.Shiker! – bragboy 2010-06-10 14:19:13