如何使用Ruby中的循环创建具有不同列数的数组?

时间:2019-02-14 04:20:44

标签: ruby-on-rails arrays ruby prawn

我需要根据某些变量值是“ Show”还是“ Hide”来创建具有不同列数的数组。

  • activity_types有很多activities

  • activity_type属于用户

  • activities将有多个columns: date, duration, cost, subject...

  • activity_types每个活动列都有一个对应的切换列,   例如:subject_toggle,`duration_toggle

这些切换列的值只能为“显示”或“隐藏”

所以我想在 prawnpdf 中为所有不同的activity_types创建一系列表。每个表格应显示不同的列集,具体取决于该列的activity_type切换变量是“显示”还是“隐藏”

我开始研究这个问题,很快就不知道它是如何有条件地在数组中创建列的。我可以将其保留为空白(有一个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 :(得分:0)

您可以使用Array#compact从数组中删除空元素:

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

  

紧凑→new_ary

     

返回已删除所有nil元素的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? }