2017-02-10 13 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

Вы можете перебрать данные по вашему мнению usong ERB. Вы можете зацикливать дважды, если он пишет запись easoer (один раз для th и снова для td) –

ответ

3

Начнем с этапа подготовки. Нам понадобятся stub дней недели, позже мы будем использовать в качестве строительных лесов для исходных данных:

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

и редуктора для исходных данных:

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

ОК, мы все готово ,

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

Теперь просто повторите указанные выше и распечатайте значения.

 Смежные вопросы

  • Нет связанных вопросов^_^