0

日付ごとにいくつかのレコードをグループ化し、それらの日ごとに 1 つのフィールドを合計する必要があります。

これは私がリファクタリングしようとしているコードです:

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

編集 -

OK、その場合、あなたのコードは非常に近いように見えます:

<% 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 に答える