Rails 3.1 - 事件列表 - 如何处理跨越许多日期的事件?

时间:2012-06-09 08:26:48

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

我正在建立一个活动列表网站。目前,每个事件都会输入特定日期并按顺序显示......简单!但是,我需要考虑如何处理跨越多个日期的节日和戏剧等活动。一次又一次地为每个日期输入事件不是最佳选择。我以为我可以有一个开始日期和结束日期,但是我不知道如何在我的索引中将事件显示在开始/结束之间的日期。这可能非常简单,但我只是觉得我会为那些有更多经验的人寻求一些指导,然后我才能用这条路走错路。

目前的事件架构:

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这些日期发生。任何想法如何处理?

2 个答案:

答案 0 :(得分: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 %>

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

答案 1 :(得分:0)

我认为你不需要分组。

@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,但你明白了