Rails:基于属性对部分进行分组

时间:2011-09-12 00:41:53

标签: ruby-on-rails date calendar partial partials

我有一个使用日历的应用程序,我想在登录时提供日历摘要。摘要应格式化,以便显示今天,明天和本周的事件,如下所示:

  

活动:

     

今天

     
      
  • 活动1
  •   
     

明日

     
      
  • 活动2
  •   
  • 活动3
  •   
  • 活动4
  •   
     

本周

     
      
  • 活动5
  •   
  • 活动6
  •   
  • 活动7
  •   
  • 活动8
  •   

如何根据日期以正确的方式渲染局部图像?

2 个答案:

答案 0 :(得分:0)

第一个可以添加一个模型方法for_dates(start_date,end_date),它包含: where([:date_column >= ? and :date_column <= ?, start_date, end_date])

然后使用:

Model.for_dates(Date.today, Date.today)

Model.for_dates(Date.today+1, Date.today+1)

默认'周'是周日到周一。如果您希望不同的日期,请添加偏移量,例如

周一至周五是

Model.for_dates(Date.today.beginning_of_week+1, Date.today.end_of_week+1)

答案 1 :(得分:0)

假设您的模型被称为Event并且它具有date属性,并且您的这些属性集合称为@events,这里有一个想法:将此放在您的视图中...... < / p>

<ul>
<%= render @events, locals: { events: @events } %>
</ul>

...那么你会有一个名为_event.html.erb的部分看起来像这样:

<%  last_event = event_counter == 0 ? nil : events[event_counter - 1]
    next_event = events[event_counter + 1]
%>
<%  if last_event && last_event.date != event.date
    # add a new date header and start a new nested list of events
%>
  <li><h3><%= event.date %></h3>
    <ul>
<% end %>

      <li><%= link_to event %></li>

<%  if next_event && next_event.date != event.date
    # end the nested list and make way for the next date header and set of events
%>
    </ul>
  </li>
<%  end %>

我们在整个render集合中传递的@events电话作为一个名为events的本地电话,有什么好处。然后在部分内部,我们使用自动生成的event_counter方法来查找集合中的上一个(events[event_counter - 1])和下一个(events[event_counter + 1])事件。然后,如果当前event的日期与last_event的日期不同(意味着它是该日期的第一个),我们将开始一个带有新日期标题的新集合,如果日期为{ {1}}与event的日期不同(即它是该日期的最后一个日期)我们结束了该集合。

这有点难看,而且有更优雅的方法可以做到这一点,但是它完成了工作。