【问题标题】:Rails : Show records by months in the view, any other way?Rails:在视图中按月份显示记录,还有其他方式吗?
【发布时间】:2011-05-05 23:57:34
【问题描述】:

场景: 我有一堆火柴。我想在我的视图中创建一个带有 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) 匹配项似乎是一种浪费。我可以使用其他解决方案吗?我是否应该在跟踪月份的“匹配”之外保留一个单独的表格。也许我对此有点过分了,目前的解决方案还可以。想法?

【问题讨论】:

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


    【解决方案1】:

    如果可以安全地假设第一条记录和最后一条记录之间每个月都有匹配项,您可以:

    # 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(...) 进行条件查找。

    【讨论】:

    • 由于某种原因,'step 方法正在生成错误。我尝试了您的解决方案,但出现以下错误。 “2011-04-02 12:45:00 UTC:Time 的未定义方法‘步骤’”
    • Time 没有 step 方法。只需将它们转换为日期即可。我更新了答案以反映这一点。
    • 解决了这个问题,只要我每个月都有比赛,这个解决方案就很棒。但是如果我每个月都没有比赛(即休赛期),可以肯定地说我的第一个解决方案就是我需要使用的吗?
    • @neuone 也许,是的。如果您使用 memcache 来缓存数据库结果,那么即使有 1500 多行,您也应该没问题。您可能还想使用 SQL 函数从帖子中获取月份。它要快得多,尤其是在您为这些列编制索引的情况下。
    • 我将看看 memcache 以及 SQLite3 语句的外观。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多