我需要根据某些变量值是“ 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
答案 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? }