2016-03-27 15 views
0

Bir grafiği doldurmak için son 7 günden (destek ay ve yıl olarak değişebilir) kayıtları almaya çalışıyorum ve hiçbir kayıt bulunamayan günlerde kayıt olmam gerekiyor. İlk önce gruplamayı denedim, ancak bulunamadı verilerin uydurulmasını yolu, bu yüzden bu geldi:Kayıt bulunamadıysa, son 7 gün içindeki kayıtlar 0'a getirilir.

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 

sonuç anahtar ve değer olarak hesaplanmış bir özellik toplamı olarak bir gün bir karma olduğunu.

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"]] 

Bunu nasıl veritabanına sadece 1 geçecektir yapmak için bu işlemler yapabiliyorsunuz:

ancak

Bu, her gün için bir veritabanı sorgu gerektirir?

cevap

1

belli değil bu ne demek, ama burada ben yapmanız gereken düşünmek ne: Son N gün boyunca tüm verileri alma

  • çalıştırın sorgusu.
  • Grup günden bu kayıtlar
  • Birleştirme bu onun cevabını sözü tpbowden olarak
0

Tamam Son N gün her biri için { date => 0} değerlerine sahip bir karma üstündeki, bunu azaltmak için yönetilen Bu gibi 1 sorgu için:

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) 
İlgili konular