rails 3循环哈希但不重复

时间:2011-08-12 10:27:49

标签: ruby-on-rails

我通过嵌套的Booking类循环遍历哈希。我希望它从哈希中创建一个时间表,如果有一个预订对象,其时间与哈希值相同,则表示“可用”或“已预订”。

index.html.erb

table
<%  @times.each_with_index do |(key, value), index| %>
tr
<td><%= key %></td>

  <% for booking in @bookings %>
    <% if booking.time.strftime("%H").to_s == value.to_s then %>
     <td> <em> Booked </em> </td>
    <% end %> 
  <% end %>

  <% if booking.time.strftime("%H").to_s != value.to_s then %>
  <td> <em> Available </em> </td>
  <% end %> 
/tr
<% end %>
/table

这产生了这个:

9am     Available
10am    Available
11am    Available 
12am    Available
1pm     Booked  Available
2pm     Available
3pm     Available
4pm     Booked
5pm     Available
6pm     Available
7pm     Available
8pm     Available
9pm     Available 

所以它在下午1点重复循环,因为该值已经第二次改变。我怎样才能避免这种情况发生?

3 个答案:

答案 0 :(得分:2)

@Chowletts答案似乎做了你想要的,但我不能忍受在没有必要时在循环内进行不必要的计算。所以这是我的解决方案:

<%  
    booking_times = @bookings.map{ |booking| booking.time.hour }
    @times.each_with_index do |(key, value), index| 
%>
  tr
    <td><%= key %></td>
    <td><em><%= booking_times.include?(value.to_i) ? "Booked" : "Available" %></em></td>
  /tr
<% end %>

答案 1 :(得分:1)

如果 last 预订与此时间不匹配,问题是您有效地显示“可用”。如果您找到预订,可以使用您设置的标志:

<table>
<%  @times.each_with_index do |(key, value), index| %>
<tr>
<td><%= key %></td>
  <% booked = false %>
  <% for booking in @bookings %>
    <% if booking.time.strftime("%H").to_s == value.to_s then %>
     <td> <em> Booked </em> </td>
     <% booked = true %>
    <% end %> 
  <% end %>

  <% if !booked %>
  <td> <em> Available </em> </td>
  <% end %> 
</tr>
<% end %>
</table>

或者,如果您在has_oneTime之间设置Booking(或其他)关系,则只需检查时间是否与预订相关联。

答案 2 :(得分:1)

更简单的方法:

table
<%  @times.each_with_index do |(key, value), index| %>
tr
<td><%= key %></td>

  <% if @bookings.index{|booking| booking.time.strftime("%H").to_s == value.to_s}  then %>
    <td> <em> Booked </em> </td>
  <% else %>
    <td> <em> Available </em> </td>
  <% end %> 

/tr
<% end %>
/table