2016-09-16 2 views
1

В приведенном ниже коде показано количество встреч каждый час и «Нет назначения», если назначение не доступно.Группа, в которой нет назначения

Я хочу, чтобы сгруппировать подряд «Нет назначения» слот не по времени

для, например, выход из текущего кода -

10:00 AM to 11:00 AM -> No Appointment 11:00 AM to 12:00 PM -> No Appointment 12:00 PM to 01:00 PM -> No Appointment

Я хочу выход быть

10:00 AM to 01:00 PM -> No Appointment

Код дает ниже: -

<% @time_group = ['6:00:00','7:00:00','8:00:00','9:00:00','10:00:00','11:00:00','12:00:00','13:00:00','14:00:00','15:00:00','16:00:00','17:00:00','18:00:00','19:00:00','20:00:00','21:00:00','22:00:00','23:00:00'] %> 

#Loop through each hour in @time_group 
<% @time_group.each_with_index do |t,index| %> 
    <% t1 = Time.parse(t) %> 
    <% t2 = Time.parse(t) + 3600 %> 
    <% @booked = Appointment.where(start_time: t1..t2 %> 

    #Show time interval e.g 1:00 PM to 2:00 PM 
    <%= Time.parse(t).strftime('%I:%M %p') %> to <%= (Time.parse(t) + 3600).strftime('%I:%M %p') %> 

    #if appointment is available show appointment else show no appointment 
    <% if @booked.size > 0 %> 

    <% @booked.each do |app| %> 
     <%= app.start_time.strftime('%I:%M') %> 
    <% end %> 

    <% else %> 

    No Appointment 

    <% end %> 
<% end %> 

ответ

1

Прежде всего, можно было бы подготовить массив:

@time_group = ['6:00:00','7:00:00', ...] 
@stacked = @time_group.each_with_object([]) do |start, memo| 
    range = Time.parse(start)..Time.parse(start)+3600 
    booked = Appointment.where(start_time: range) 
    if memo.empty? || !booked.empty? || !memo.last.last.empty? 
    memo << [range, booked] # no sequenced empty slots 
    else 
    memo << [memo.pop.begin..range.end, booked] # merge ranges 
    end 
end.to_h # { ranges => booked } 

И выход теперь давайте им:

<% @stacked.each do |range, booked| %> 
    ..... 
<% end %> 
+0

Ok получила идея .. спасибо – vidal

0

Попробуйте как этот

<% @time_group = ['6:00:00','7:00:00','8:00:00','9:00:00','10:00:00','11:00:00','12:00:00','13:00:00','14:00:00','15:00:00','16:00:00','17:00:00','18:00:00','19:00:00','20:00:00','21:00:00','22:00:00','23:00:00'] %> 

#Loop through each hour in @time_group 
<% @time_group.each_with_index do |t,index| %> 
    <% t1 = Time.parse(t) %> 
    <% t2 = Time.parse(t) + 3600 %> 
    <% @booked = Appointment.where(start_time: t1..t2) %> 


    #It will holds the No Appointment Timings into it 
    no_appointment_array = [] 

    #if appointment is available show appointment else show no appointment 
    <% if @booked.size > 0 %> 

    #Calling the Function 
    display_no_appointment(no_appointment_array) if not no_appointment_array.empty? 


    #Show time interval e.g 1:00 PM to 2:00 PM 
    <%= Time.parse(t).strftime('%I:%M %p') %> to <%= (Time.parse(t) + 3600).strftime('%I:%M %p') %> 

    <% @booked.each do |app| %> 
     <%= app.start_time.strftime('%I:%M') %> 
    <% end %> 

    <% else %> 

    no_appointment_array << [Time.parse(t).strftime('%I:%M %p'), (Time.parse(t) + 3600).strftime('%I:%M %p')] 

    <% end %> 
<% end %> 


def display_no_appointment(no_appointment_array) 
    puts "#{no_appointment_array.first[0]} to #{no_appointment_array.last[1]} -> No Appointment" 

    #It Clears all Previous No Appointment 
    no_appointment_array.clear 

end 
0

Прежде всего я предлагаю вам использовать, если '@ booked.present? вместо 'if @ booked.size> 0'

Вы пробовали что-то вроде этого? Я не тестировал этот код, это почти идея возможного решения. Надеюсь, что это может быть полезно для вас.

<% no_appointment_starts_at = nil %> 
<% no_appointment_ends_at = nil %> 

<% @time_group.each_with_index do |t,index| %> 
    <% t1 = Time.parse(t) %> 
    <% t2 = Time.parse(t) + 3600 %> 
    <% @booked = Appointment.where(start_time: t1..t2 %> 

    #Show time interval e.g 1:00 PM to 2:00 PM 


    #if appointment is available show appointment else show no appointment 
    <% if @booked.present? %> 

    <% @booked.each do |app| %> 
     <% unless no_appointment_ends_at.blank? %> 
      <%= Time.parse(no_appointment_starts_at).strftime('%I:%M %p') %> to <%= (Time.parse(no_appointment_ends_at) + 3600).strftime('%I:%M %p') %> 
      <% no_appointment_ends_at = nil%> 
     <% end %> 
     <%= Time.parse(t).strftime('%I:%M %p') %> to <%= (Time.parse(t) + 3600).strftime('%I:%M %p') %> 
     <%#= app.start_time.strftime('%I:%M') %> 
     <% no_appointment_starts_at = t2 %> 
    <% end %> 

    <% else %> 
     <% last_appointment_ends_at = t2 %> 
    <% end %> 
<% end %>