SCENARIO:我有一堆火柴。我想在我的视图中创建一个带有 HTML 链接的侧列,您可以在其中按月查看比赛。这是我目前的实现:
当前解决方案:
#Controller
@matches_by_month = Match.find(:all).group_by {|match| match.kickoff.strftime('%B %Y')}
#View
<% @matches_by_month.each do | month, matches | %>
<%=link_to month %><br>
<% end %>
# Returns in the side column links that look like this.
# April 2011
# May 2011
# Which is great!
寻求建议:我认为这不是一个好的解决方案,因为在一段时间内,此页面会变慢。右?到 2013 年,我可以有 1500 条记录,为了获得月份而不断查找(:all)匹配项似乎是一种浪费。我可以使用其他解决方案吗?我是否应该在跟踪月份的"匹配"之外保留一个单独的表。也许我对此过分了,当前的解决方案还可以。思潮?
如果可以
安全地假设第一个记录和最后一个记录之间每个月都有匹配项,您可以:
# for your sidebar
start_date = Match.first.kickoff.to_date
end_date = Match.last.kickoff.to_date
<% start_date.step(end_date, 1.month) do |date| %>
<%= link_to date.strftime('%%B %Y'), matches_by_month_path(date) %>
<% end %>
然后在控制器中,只需解析所选日期并使用Match.where(...)
进行条件查找。