2017-02-10 11 views
0

Ich habe eine Ruby/Rails-Ansicht wo-in den Mitarbeitern Namen werden auf der Y-Achse (Linke Seite) und Woche Termine oben beginnend von Sonntag und endet am Samstag der angezeigt Woche.Looping durch eine Sammlung von Daten - Ruby

  '2017-02-05' '2017-02-06' '2017-02-07' '2017-02-08' '2017-02-09' '2017-02-10' '2017-02-11' 

Employee_1  7            3    4.5 

Employee_2      4    6.2    0.5       10.5 

Wenn ich die Details aus der Datenbank ziehen, werden die Daten in der folgenden Form sein. Das Datum ist in YYYY-MM-DD Format.

@data = 
    {"Employee_1"=> 
     [{"week_date"=>"2017-02-05", 
     "log_time"=>"7"}, 
     {"week_date"=>"2017-02-08", 
     "log_time"=>"3"}, 
     {"week_date"=>"2017-02-09", 
     "log_time"=>"4.5"}], 
    "Employee_2"=> 
     [{"week_date"=>"2017-02-06", 
     "log_time"=>"4"}, 
     {"week_date"=>"2017-02-07", 
     "log_time"=>"6.2"}, 
     {"week_date"=>"2017-02-08", 
     "log_time"=>"0.5"}, 
     {"week_date"=>"2017-02-10", 
     "log_time"=>"10.5"}] 
    } 

Außerdem haben wir ein Array, das den Wochentag enthält:

@week_days = ["2017-02-05", "2017-02-06", "2017-02-07", "2017-02-08", "2017-02-09", "2017-02-10", "2017-02-11"] 

Wie kann ich nur Schleife diese Struktur und Anzeigedaten für die Tage, für die die Daten zur Verfügung stehen und überspringen Rest der Daten in der HTML-Tabellenstruktur in der Ansicht?

+0

Was haben Sie schon versucht? – mudasobwa

+0

Es gibt nicht viel, was ich zeigen kann. Ich konnte nur den Angestelltennamen drucken, den wir auf dem ersten von jedem zeigen können. Aber die Anzeige der Daten in den übrigen TD's scheint nur wenig schwierig zu sein. Wir müssen mit dem Wochentag übereinstimmen und wenn Daten verfügbar sind, zeigen Sie es im entsprechenden TD an und wenn nicht, lassen Sie es leer. –

+0

Sie können die Daten in Ihrer Ansicht mit ERB überschleifen. Sie können zweimal Schleife, wenn es das Schreiben der Tabelle easoer macht (einmal für th und wieder für td) –

Antwort

3

Beginnen wir mit einem Vorbereitungsschritt. Wir brauchen eine stub Wochen Tage, wir später als Gerüst für die Originaldaten verwenden werden:

stub = @week_days.map { |wd| {wd => ""} }.reduce(&:merge) 

und ein Untersetzungsgetriebe für die Originaldaten:

reducer = ->(v) { 
    v.map { |h| {h["week_date"] => h["log_time"]} }.reduce(&:merge) 
} 

OK, wir sind alle Set .

@data.map { |k, v| [k, stub.merge(reducer.(v))] }.to_h 
#⇒ { 
# "Employee_1" => { 
# "2017-02-05" => "7", 
# "2017-02-06" => "", 
# "2017-02-07" => "", 
# "2017-02-08" => "3", 
# "2017-02-09" => "4.5", 
# "2017-02-10" => "", 
# "2017-02-11" => "" 
# }, 
# "Employee_2" => { 
# "2017-02-05" => "", 
# "2017-02-06" => "4", 
# "2017-02-07" => "6.2", 
# "2017-02-08" => "0.5", 
# "2017-02-09" => "", 
# "2017-02-10" => "10.5", 
# "2017-02-11" => "" 
# } 
# } 

Jetzt wiederholen Sie einfach die obigen und drucken Sie die Werte.