2011-12-12 61 views
0

我有一个有很多日期的事件模型。使用has_many在rails中使用has_many关联日期事件

我列出了下周的活动,并希望将活动按天分组,并仅显示已发布的活动。我有以下代码,它可以工作,但它仍然包含未发布的事件。

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

做这样的事情:

@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 

注意 - >你没有指定列的确切名称,所以我猜测你的事件有一个名字,或者你的日期表有一个列呼叫日期。

我希望这是有用的!

编辑: 如果按日期要他们组,从数据库中获取它们之后(这个很重要),你确实可以使用group_bygroup by is located in Enumerable/group_by)这样

@published_events.all.group_by(&:date_of_event) 

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

+0

到目前为止感谢......以日期顺序显示它们,但事件可以使用group_by分组为几天? – Nick