在视图中按rails datetime进行组织

时间:2015-07-15 17:26:44

标签: ruby-on-rails ruby date datetime ruby-on-rails-4

我正在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变量分组各种日期的最佳方法是什么?

1 个答案:

答案 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 %>