【问题标题】:How to sum fields after group_by如何在 group_by 之后对字段求和
【发布时间】:2013-04-27 08:51:42
【问题描述】:

我需要按日期对一些记录进行分组,然后为每一天汇总一个字段。

这是我要重构的代码:

<% @startdate.upto(@enddate) do |date| %>
  <% visitors = @links.where("created_at >= ? AND created_at < ?", date, date+1).order("created_at ASC").select("id, visit_count") %>
  <%= datevisitors.sum("visit_count") || 0 %>
<% end %>

我已经开始了:

<% visitors = @links.select("visit_count, created_at").group_by{|l| l.created_at.day} %>
<% @startdate.upto(@enddate) do |date| %>
  <%= visitors[date] ...?
<% end %>

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord group-by


    【解决方案1】:

    当您 group_by 某事时,您会收到一个包含日期和元素的数组。因此,如果您按天分组,您将拥有 Day 和数组中的元素:

    <% @links.group_by{|l| l.created_at.day}.each do |day, links| %>
      <p><%= day %>: <%= links.sum(&:visit_count) %></p>
    <% end %>
    

    编辑 --

    好的,在这种情况下,您的代码看起来非常接近:

    <% visitors = @links.select("visit_count, created_at").group_by{|l| l.created_at.day} %>
    <% @startdate.upto(@enddate) do |date| %>
      <% if visitors[date] %>
        <%= visitors[date].sum(&:visit_count) %>
      <% else %>
        0
      <% end %>
    <% end %>
    

    最好将其移至帮助者(或演示者)

    def daily_visits(links, from, to)
      links_by_day = links.select("visit_count, created_at").group_by{|l| l.created_at.day}
      range = from.upto(to).to_a
      range.inject({}) do |date, hash|
        hash[date] = links_by_day.fetch(date, 0)
      end
    end
    

    那么,在视图中:

    <% daily_visits(@links, @startdate, @enddate).each do |day, count| %>
      <%= day %>: <%= count %>
    <% end %>
    

    【讨论】:

    • 感谢您的回答杰西。在我的情况下,@links 不一定每天都有一个正值,所以这个解决方案可以掩盖 0 值天。
    • @sscirrus 我更新了我的答案以显示您的解决方案的 0 天
    【解决方案2】:

    您好,您可以给我将要使用的型号吗?

    这是我在 Activerecord 上使用聚合求和函数的示例:

    <% @sum_visit_count = Visitor.find(:all, :select => "SUM(visit_count)", :group => "id, date_visit") %>
    
    and 
    
    <%= @sum_visit_count.sum %>
    

    【讨论】:

      【解决方案3】:

      这应该在控制器上

      @dates_with_visitors = @links.select("visit_count, created_at").group_by(&:created_at)
      

      这应该在视图中

      <% @dates_with_visitors.each do |date_with_visitors| %>
        <%= "#{date_with_visitor[0]} - Visits: #{date_with_visitors[1].sum(&:visit_count)}" %>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-21
        • 2015-09-10
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        相关资源
        最近更新 更多