我通过嵌套的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点重复循环,因为该值已经第二次改变。我怎样才能避免这种情况发生?
答案 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_one
和Time
之间设置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