Как вывести таблицу Dynami c с массивом хешей - PullRequest
0 голосов
/ 25 марта 2020

Это сводило меня с ума последние два дня.

{{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
 {:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
 {:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
 {:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}}

У меня есть эти данные, которые я получил из запроса ActiveRecord и отобразил таким образом, что у меня есть количество задач, выполненных пользователем в день. Пользователь в основном выбирает месяц и год, например, март 2020 года, и подсчитывает количество задач для пользователя с начала и конца месяца.

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

Таблица

Я пробовал несколько вещей, таких как перевод имен и дат в совершенно отдельный массив и попытка вывода на основе условий, но я не могу не похоже, чтобы это работало. Обратите внимание, что заголовки таблицы являются динамическими c на основе указанных дат. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 25 марта 2020

Итак, вы можете сделать это таким образом (это всего лишь пример, чтобы он соответствовал вашим потребностям)

obj = {
  {:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
  {:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
  {:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
  {:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}
}
columns = obj.map { |k, _v| k[:completed_at] }.uniq
strokes = obj.map { |k, _v| { id: k[:id], name: k[:name] } }.uniq

result = []

result.push('name')
columns.each do |c|
  result.push(c)
end

strokes.each do |stroke|
  result.push(s[:name])
  columns.each do |column|
    cell = obj.find do |k, _v|
      k[:id] == stroke[:id] && k[:completed_at] == column
    end
    result.push(cell&.last.try(:[], :count))
  end
end

И результат будет

[
  "name", "2020-03-01", "2020-03-03", "2020-03-04", 
  "Brown, James", 5, 6, nil, 
  "Allen, John", 6, nil, nil, 
  "Davis, Carl", nil, nil, 10
]
...