Как создать массивы с разным количеством столбцов, используя цикл в Ruby? - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно создать массивы с разным количеством столбцов в зависимости от того, являются ли определенные значения переменных «Показать» или «Скрыть».

  • activity_types имеет множество activities

  • activity_type принадлежит пользователю

  • activities будет иметь число columns: date, duration, cost, subject...

  • activity_types имеет соответствующий столбец переключения для каждого столбца активности, например: subject_toggle, `duration_toggle

эти столбцы-переключатели могут иметь значения только "Показать" или "Скрыть"

Поэтому я хочу создать серию таблиц в prawnpdf для всех различныхactivity_types.Каждая таблица должна иметь разные наборы столбцов, отображаемых в зависимости от того, является ли переменная activity_type для этого столбца «show» или «hide»

Я начал работать над этим и быстро не знал, как он условно создает столбцыв массиве.Я мог бы оставить его пустым (иметь оператор if, который будет выводить пустым, если его «Скрыть»), но он не будет удалять столбец.

Ниже приведен мой код для создания таблиц для prawnpdf .

ActivityType.all.each do |type|
define_method("method_#{type.id}") do
  move_down 20
  font "Nunito"
  text type.title, :align => :left, size: 13, style: :bold
  move_down 5
  table eval("rows_#{type.id}"), :position => :center, :width => 540, :column_widths => {0 => 50, 8 => 60},
                                 :cell_style => {:font => "Nunito", :size => 10} do
    row(0).font_style = :bold
    columns(0..8).align = :center
    self.row_colors = ["F0F0F0", "FFFFFF"]
    self.header = true
  end
end end


  ActivityType.all.each do |type|
define_method("rows_#{type.id}") do
  [["Date", "Subject", "Details", "Time (min)","Contact","Detail","Outcome","Agent",""]] +
    type.activities.order(date: :asc).map do |activity|
      [activity.date.strftime("%b %d"), activity.subject, activity.contact, activity.detail,
      activity.outcome, activity.agent, activity.customer, activity.cost, activity.duration.to_i ]
    end
end end

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете использовать Array#compact для удаления пустых элементов из вашего массива:

https://ruby -doc.org / core-2.1.2 / Array.html # method-i-compact

compact → new_ary

Возвращает копию self без всех удаленных элементов.

[ "a", nil, "b", nil, "c", nil ].compact
                  #=> [ "a", "b", "c" ]

Тем не менее, он будет удалять только значения nil.Если ваши значения также могут быть пустыми строками, вы можете использовать reject.

В вашем конкретном случае это будет:

[activity.date.strftime("%b %d"), activity.subject, activity.contact, activity.detail,activity.outcome, activity.agent, activity.customer, activity.cost, activity.duration.to_i ].reject { |el| el.nil? || el.empty? }
...