2017-02-10 98 views
0

我有一个Ruby/Rails视图,其中 - 员工姓名将显示在Y轴(左侧)和周日期顶部从星期天开始到星期六结束周。循环访问数据 - 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 

当我从数据库中提取细节时,数据将在下面的表格中。日期格式为YYYY-MM-DD

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

另外,我们有一个包含工作日的数组:

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

哪有我只是循环对于该数据是可用的,并跳过其余日期,这种结构和显示数据视图中HTML表格结构的日期?

+0

你已经试过了什么? – mudasobwa

+0

我可以展示的东西并不多。我只能打印员工姓名,我们可以在每个的第一个​​上显示。但是连续显示其他TD的数据似乎有点棘手..我们必须与周日期匹配,并且如果数据可用,则在相应的TD中显示它,如果不留空白。 –

+0

您可以遍历ERB视图中的数据。你可以循环两次,如果它使表写入容器(一次为一次,再次为TD) –

回答

3

让我们从准备步骤开始。我们需要一个stub周天后,我们会作为支架以后使用原始数据:

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

和原始数据的减速器:

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

OK,我们都是集。

@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" => "" 
# } 
# } 

现在只需重复上述和打印值。