我正在Rails中创建一个调度应用程序,并且在尝试按日期组织房间时遇到困难。当我说一个房间时,我基本上只是表示时间表中的一个块。典型的活动可能是午餐(一个房间),然后是网络部分(另一个房间)。以下是我如何获得房间:
@rooms = Room.where(event_id: @current_event.id).order(:start_time)
因此,按照开始时间的顺序返回属于事件的房间。在我看来,我循环并显示事件的房间,但我希望在视图中按日期对它们进行分组,以防有多天的事件。
此外,:start_time
是Ruby中的日期时间类型。在人类说话中,我要做的是查看日期部分,如果房间日期与当前组不同,我会打印新日期并继续对当天的房间进行分组。这是一个简单的例子,以防我不清楚:
Event: Staff Retreat
July 14th, 2015
-----------------------
12:30 PM
Team building Lunch Begins
------------------------
6:30 PM
Team building Dinner Begins
------------------------
July 15th, 2015
------------------------
9:30 AM
Team building Breakfast Begins
因此,将@rooms
变量中的房间分组为日期时间,显示如上所述的表格的最佳方法是什么?我认为在我的循环中我应该检查日期是否与前一个房间相同,如果不打印日期
- @rooms.each do |room|
room.start_time.strftime("%B %d, %Y")
room.start_time.strftime("%I:%M%p")
room.name
我遇到物流问题,因为使用模型 - 视图 - 控制器概念,我觉得在视图中排序可能会让视图执行它不应该做的事情。我也在视图中如何做到这一点。我认为在控制器中设置一个变量来保存临时日期,因为我循环可以工作,但看起来这会变得非常混乱。从@rooms
变量分组各种日期的最佳方法是什么?
答案 0 :(得分:1)
你能试试吗?这将返回一个哈希,其中date是键,value将包含与该时间相关的所有@rooms。
@rooms = Room.where(event_id: @current_event.id)
@rooms = Hash[@rooms.sort_by{|o| o.start_time.to_date}.group_by {|room| room.start_time.to_date}.map{|l,m| [l, m.sort_by{|k| k.start_time}]}]
现在您可以在视图中遍历这样的房间。我把代码放在erb格式。
<% @rooms.each do |k, v| %>
<%= k %>
<% v.each do |room| %>
<%= room.created_at.start_time('%I:%M %p')%>
<%= #room.name or title what so ever. %>
<% end %>
<% end %>