Ничего особенного в 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 не очень много значим.