【问题标题】:Rails 3.1 - Events Listings - How to handle events that span many dates?Rails 3.1 - 事件列表 - 如何处理跨越多个日期的事件?
【发布时间】:2012-06-09 08:26:47
【问题描述】:

我正在建立一个活动列表网站。目前每个事件都输入特定日期并按顺序显示......简单!但是,我需要考虑如何处理跨越多个日期的节日和戏剧等事件。在每个日期一遍又一遍地输入事件显然不是最好的选择。我以为我可以有一个开始日期和结束日期,但我不确定如何让事件在我的索引中显示开始/结束之间的日期。这可能真的很简单,但我只是想在我可能走上错误的道路之前,我应该为那些有更多经验的人寻求一些指导。

目前的事件架构:

create_table "events", :force => true do |t|
    t.date     "event_date"
    t.string   "headline"
    t.text     "info"
    t.integer  "event_type_id"
    t.integer  "venue_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "event_image_file_name"
    t.string   "event_image_content_type"
    t.integer  "event_image_file_size"
    t.datetime "event_image_updated_at"
    t.boolean  "free"
  end

我的事件控制器索引确实:

 @events = Event.paginate(:page => params[:page], :per_page => 12).find(:all, :conditions => ['event_date >= ?', Date.today], :order => "event_date")

编辑: 我应该指出,我在事件控制器索引方法中列出了带有由以下行生成的日期标题的事件:

@events_dates = @events.group_by { |e| e.event_date }

视图大致如下:

<% @events_dates.sort.each do |event_dates, events| %>
<div class="well">
<h3>
<% if event_dates == Date.today %>
Today
<% elsif event_dates == Date.today + 1 %>
Tomorrow
<% else %>
<%= event_dates.to_date.to_formatted_s(:my_format) %>
<% end %>
</h3>
</div>

<%= render events %>
<% end %>

事件部分有事件标题、信息等。

所以,我认为我需要做的是改变循环浏览日期标题的方式。我不需要从数据库中对事件日期进行分组然后循环这些日期,而是几乎需要遍历日历日,并根据 event_start_date 和 event_end_date 查看事件是否在这些日期发生。有什么想法可以解决这个问题吗?

【问题讨论】:

  • “我不确定如何让事件在我的索引中显示开始/结束之间的日期” - 这是什么意思?你想让它显示什么?看起来它正在显示即将发生的事件。您希望它显示所有未完成的事件吗?如果是这样,请使用两个字段,将单日事件的开始日期和结束日期设置为同一天,并将条件更改为 end_date &lt;= ?, Date.today 或类似的内容。
  • 另外,不推荐使用带有条件的散列。您需要在某个时候更新 Rails 3 的语法。
  • 感谢条件指针....我会尽快更新。回答您的第一个问题;目前,即将举行的活动将显示活动日期,但例如我有一个在 1 日至 3 日发生的活动,如何使我的列表显示“活动 A - 2nd MM YYYY”。我实际上已经对日期标题进行了分组,所以我希望它显示在第 1、第 2 和第 3 下。可能很容易....我会在使用结束日期方面有所突破!

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

如果你有开始和结束日期,使用条件哈希:

:conditions => ["event_start_date <= ? AND event_end_date >= ?", Date.today, Date.today]

或者是:

.where("event_start_date <= ? AND event_end_date >= ?", Date.today, Date.today)

编辑:

好的,所以您想遍历一个日期范围,然后显示当天的所有事件。要迭代一个日期范围,你可以使用 ruby​​ 的 Date.upto() 函数,对于每个日期,你可以只迭代事件,并且只显示与当前日期相关的事件。

以下代码假设您已经在控制器中设置了@start_date 和@end_date。

<% @start_date.upto(@end_date) do |date| %>
<div class="well">
<h3>
<% if date == Date.today %>
Today
<% elsif date == Date.today + 1 %>
Tomorrow
<% else %>
<%= date.to_formatted_s(:my_format) %>
<% end %>
</h3>
</div>

<%= render @events.select{|event| event.start_date < date && event.end_date > date} %>
<% end %>

虽然这里的视图中有太多的逻辑,你可能需要做一些调整才能让它工作,但它应该能让你走上正确的道路。

【讨论】:

  • 谢谢,我试试这个。
  • 我已经意识到这是我生成需要处理的日期标题的方式,因此我发布了对我的问题的更新。
  • 很好,我现在要试试这个。
  • 似乎几乎可以完美运行,除了我在event.end_date &gt; date 中遇到的错误,知道为什么吗?
  • 啊,我想这是因为我的所有活动都没有定义 end_date!
【解决方案2】:

我认为你不需要分组。

@events = Event.where('start_date >= ? AND end_date >= ?', Date.today.beginning_of_day], Date.today.beginning_of_day]).order(:start_date)

在您看来,请执行以下操作:

  Today
  <% for event in @events %>
    <% if event.start_date == Date.today %>
      <%= render "events/event" %>
    <% end %>
  <% end 
  Tomorrow
  <% for event in @events %>
    <% if event.start_date == Date.tomorrow %>
      <%= render "events/event" %>
    <% end %>
  <% end %>

这就是你想要达到的目标吗?

你需要稍微清理一下,也许使用for event in @events.where date is today,但你明白了

【讨论】:

  • 嗯,再次阅读您的问题后,您可能想要获得的不仅仅是今天和明天的事件?
  • 是的,我想我实际上是在尝试创建一个日历,但使用的是列表视图而不是传统的表格视图。如果没有显示没有事件的日期,我也更喜欢它。您可以在此处查看基于单个日期的事件的当前视图:wozzoncornwall.co.uk/events,如果可能,我想保持这个?
猜你喜欢
  • 2016-04-24
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多