使用has_many:rails中的日期关联按天分组事件

时间:2011-12-12 21:54:00

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

我有一个有很多日期的活动模型。

我列出了下周的事件,并希望按日对事件进行分组,并仅显示已发布的事件。我有以下代码,它可以工作,但它仍然包括未发布的事件。

 Date.all.group_by {|d| d.date.at_beginning_of_day }.each do |datestr, dates|

理想情况下,我希望有这样的东西......

@events = Event.find(:all, :conditions => {:published => true})
@events.group_all_dates_by_day.each do |datestr, dates|

我该怎么做?

修改

这是我想做的,但我不喜欢这些代码。

@events = Event.find(:all, :conditions => {:published => true})
ids = @events.map { |event| event.dates.map { |date| date.id }.join.to_i}

Date.find(ids).group_by {|date| date.date.at_beginning_of_day }

1 个答案:

答案 0 :(得分:1)

做这样的事情:

@published_events = Event.select("events.*, dates.date AS date_of_event")
     .joins(:dates)                    # you join dates table to sort the events by date
     .where(:published => true)        # here you take only published events
     .order("dates.date ASC")         # here you order them  

在您的观看中,您会执行类似

的操作
@published_events.each do |event|
   <p><%= event.id %></p>
   <p><%= event.name %></p>
   <p><%= event.date_of_event %></p>
end  

注意 - &gt;您没有指定列的确切名称,所以我猜测您的事件有名称,或者您的日期表有列调用日期。

我希望这很有用!

编辑:    如果你想按日期对它们进行分组,在从数据库中检索它们之后(这非常重要),你确实可以使用group_bygroup by is located in Enumerable/group_by)这样

@published_events.all.group_by(&:date_of_event)

如果你喜欢这样,你最终会得到一个散列,其中每个键都是一个日期,该键的相应值是一系列事件