0

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

这是我试图重构的代码:

<% @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 %>
4

3 回答 3

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 %>
于 2013-05-03T03:24:27.177 回答
0

嗨,你能给我将要使用的模型吗?

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

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

and 

<%= @sum_visit_count.sum %>
于 2013-05-03T04:02:30.073 回答
0

这应该在控制器上

@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 %>
于 2013-05-03T02:46:50.170 回答