2016-03-27 3 views
0

私は過去7日間の記録を取ってきて(月と年をサポートするように変更するかもしれません)、グラフにデータを取り込もうとしています。データをパディングの方法が、私はこの思い付いた:レコードが見つからない場合は、最後の7日間のパディングを0にしてレコードをフェッチする方法は?

today = Date.today 

array_data = (today - 6.days..today).map do |day| 
    total_time = @project.time_entries.where(created_at: (day.beginning_of_day..day.end_of_day)).map(&:duration_hours).sum 

    { day.strftime("%a %d %b") => total_time } 
end 

@entries_data = array_data.reduce Hash.new, :merge 

結果は、キーと値として算出した財産の合計として日とハッシュです。

しかしこれは、毎日のデータベースクエリが必要です。

TimeEntry Load (1.1ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" IN ('bd9f541c-e37a-45de-bc94-28bef2b5eade') 
    TimeEntry Load (0.4ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-21 04:30:00.000000' AND '2016-03-22 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.2ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-22 04:30:00.000000' AND '2016-03-23 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.2ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-23 04:30:00.000000' AND '2016-03-24 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.2ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-24 04:30:00.000000' AND '2016-03-25 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.5ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-25 04:30:00.000000' AND '2016-03-26 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.6ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-26 04:30:00.000000' AND '2016-03-27 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 
    TimeEntry Load (0.5ms) SELECT "time_entries".* FROM "time_entries" WHERE "time_entries"."project_id" = $1 AND ("time_entries"."created_at" BETWEEN '2016-03-27 04:30:00.000000' AND '2016-03-28 04:29:59.999999') [["project_id", "bd9f541c-e37a-45de-bc94-28bef2b5eade"]] 

私はそれがデータベースにのみ1クエリを送信するために、これを手直しすることができますどのように?

答えて

1

ない特定のこれはあなたが何を意味するかであるが、ここで私はあなたがする必要があると思うものです:

  • は、最後のN日間のすべてのデータを取得するクエリを実行します。
  • グループ日
  • することにより、これらのレコードは彼の答えで述べたtpbowdenとして、私はそれを減らすことに成功し、最後のN日間
0

オクラホマのそれぞれについて、{ date => 0}の値を持つハッシュの上にこれをマージ次のように1つのクエリに:

date_format = "%d %b" 
entries_last_week = time_entries.group_by { |t| t.created_at.to_date.strftime(date_format) }.map { |k, v| { k => v.map(&:duration_hours).sum } } 
entries_hash = entries_last_week.reduce Hash.new, :merge 
today = Date.today 
days = (today - 6.days..today).map { |day| { day.strftime(date_format) => 0 } } 
hash_of_days = days.reduce Hash.new, :merge 

hash_of_days.merge(entries_hash) 
関連する問題