Ruby on rails 在月初使用组,如何在下个月再次显示活动?

Ruby on rails 在月初使用组,如何在下个月再次显示活动?,ruby-on-rails,ruby,Ruby On Rails,Ruby,使用Rails 5.0.2 我有一系列事件,按月份分组,如下所示: 四月 事件1 4月23日至4月24日 事件2 4月28日至6月22日 五月 事件3 5月4日至5月5日 问题是,有些事件会持续很久!例如,活动2从4月23日开始,到6月22日结束 我如何让活动项目在下个月再次出现 当前工作代码: 控制器: @monthly = @events.group_by { |t| t.start_date.beginning_of_month } <% @monthly.sort.each

使用Rails 5.0.2

我有一系列事件,按月份分组,如下所示:


四月 事件1

4月23日至4月24日

事件2

4月28日至6月22日


五月 事件3

5月4日至5月5日


问题是,有些事件会持续很久!例如,活动2从4月23日开始,到6月22日结束

我如何让活动项目在下个月再次出现

当前工作代码:

控制器:

@monthly = @events.group_by { |t| t.start_date.beginning_of_month }
<% @monthly.sort.each do |month, event| %>
  <h2><%= month.strftime('%B') %></h2>

    <% for event in event %>

      <li><%= event.title %></li>
      <%= event.start_date %>
      <%= event.end_date %>

    <% end %>
<% end %>
索引视图:

@monthly = @events.group_by { |t| t.start_date.beginning_of_month }
<% @monthly.sort.each do |month, event| %>
  <h2><%= month.strftime('%B') %></h2>

    <% for event in event %>

      <li><%= event.title %></li>
      <%= event.start_date %>
      <%= event.end_date %>

    <% end %>
<% end %>


  • 谢谢,你会的

    您可以采取的一种方法是首先定义要显示范围内所有月份的列表,然后将所有事件与该月份关联

    您可能希望根据需要调整以下代码-例如,如果您不想显示过去或下一个日历年的事件:

    first_start_month = Event.minimum(:start_date).beginning_of_month
    last_end_month = Event.maximum(:end_date).beginning_of_month
    
    months = [first_start_date]
    while(months.last != last_end_month) do
      months << months.last + 1.month
    end
    
    @monthly_events = months.map do |m|
      [m, @events.select { |e| (e.start_date .. e.end_date).include?(m) }]
    end.to_h
    
    first\u start\u month=事件。最小值(:start\u date)。每月的开始日期
    最后一个月末=事件。最大值(:月末日期)。月末的开始日期
    月份=[首次开始日期]
    而(months.last!=last_end_month)呢
    
    月份您可以采取的一种方法是首先定义要显示范围内所有月份的列表,然后将所有事件与该月份关联

    您可能希望根据需要调整以下代码-例如,如果您不想显示过去或下一个日历年的事件:

    first_start_month = Event.minimum(:start_date).beginning_of_month
    last_end_month = Event.maximum(:end_date).beginning_of_month
    
    months = [first_start_date]
    while(months.last != last_end_month) do
      months << months.last + 1.month
    end
    
    @monthly_events = months.map do |m|
      [m, @events.select { |e| (e.start_date .. e.end_date).include?(m) }]
    end.to_h
    
    first\u start\u month=事件。最小值(:start\u date)。每月的开始日期
    最后一个月末=事件。最大值(:月末日期)。月末的开始日期
    月份=[首次开始日期]
    而(months.last!=last_end_month)呢
    
    月份,而不是按事件的
    开始日期的月份对每个事件进行分组,您应该从1月迭代到12月,并显示该月内发生的每个事件(请参阅)。而不是按事件的
    开始日期的月份对每个事件进行分组,您应该从1月迭代到12月,并显示该月内发生的每个事件(请参阅)。虽然复杂度始终为O(mn),但我的解决方案仅在最坏的情况下为O(mn),但趋向于O(n),这是一个很好的方法。我之所以倾向于使用我的解决方案,是因为我能够轻松地更改
    第一个月的开始时间
    最后一个月的结束时间
    。有时,为了更易于阅读/操作的代码,我们值得牺牲一点性能增益:)嘿@tom,谢谢你的帮助-我在这行上得到了一个错误的范围值
    [m,@events.select{e |(e.start|u date..e.end|u date)。包括?(m)}
    nvm,通过将日期转换为字符串并切掉日期
    e.start\u date.to\u s[0…-3]
    使其正常工作,因为日期存储为2017-05-21。。不漂亮,但它的工作!再次感谢你的帮助!如果您正在寻找一个不太老套的解决方案,您可以(理想情况下)将
    开始日期
    结束日期
    存储在数据库中。或者,如果不能做到这一点,可以使用
    Date
    对象,而不是字符串。虽然复杂度始终是O(mn),但我的解决方案只有在最坏的情况下才是O(mn),但倾向于O(n)。我之所以倾向于使用我的解决方案,是因为我能够轻松地更改
    第一个月的开始时间
    最后一个月的结束时间
    。有时,为了更易于阅读/操作的代码,我们值得牺牲一点性能增益:)嘿@tom,谢谢你的帮助-我在这行上得到了一个错误的范围值
    [m,@events.select{e |(e.start|u date..e.end|u date)。包括?(m)}
    nvm,通过将日期转换为字符串并切掉日期
    e.start\u date.to\u s[0…-3]
    使其正常工作,因为日期存储为2017-05-21。。不漂亮,但它的工作!再次感谢你的帮助!如果您正在寻找一个不太老套的解决方案,您可以(理想情况下)将
    开始日期
    结束日期
    存储在数据库中。或者,如果失败,则使用来处理
    Date
    对象,而不是字符串。