2010-06-07 9 views
2

Je suis nouveau à Ruby et je sais que je n'utilise pas les méthodes simples et puissantes disponibles en son sein. Je fait mon travail de code, mais il doit être simple pas énorme (surtout je sens que je suis très mal à des variables de boucle)S'il vous plaît aidez-moi avec ce code 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 

Répondre

2

Vous pouvez vous débarrasser de l'initialisation et incrémentation du compteur des variables i et j comme ceci:

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 

ce code est 6 lignes plus courtes que le vôtre, ne peut pas faire quoi que ce soit sur le code dans les boucles, parce que je ne comprends pas vraiment ce que vous faites là.

Mise à jour: Une alternative qui fonctionne aussi:

((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

Hey mec, Merci !! regarde beaucoup beaucoup mieux que le mien .. !! – bragboy

4

Rien en particulier Ruby spécifique, mais en général garder vos méthodes à court ..

j'extraire le contenu de la boucle dans une méthode distincte. Le nom de la méthode est utilisé pour décrire ce qui se passe.

Je voudrais aussi extraire le calcul dans une méthode distincte pour décrire ce que vous essayez de faire et de garder les bits compliqués (les parties les plus susceptibles d'avoir besoin de changer) séparés ..

Quelque chose comme:

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 

Donnez aussi à vos variables i et j des noms utiles. Je ne veux pas dire beaucoup.

1

On peut se débarrasser de la variable j et éviter l'addition de j.days partout et utiliser 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

Merci M.Shiker! – bragboy

Questions connexes