def valid_sheet_names
Company.find(@company_id).asset_types.pluck(:name).reject(&:nil?).map(&:downcase)
end
["hardware", "computer", "network", "mobile devices"]
函数返回一个数组。我想从字符串中去掉空格,点和下划线。但是我不知道该怎么做
我会在数据库查询中过滤nil
值,并避免首先将它们加载到内存中。然后,我将使用一个tr
调用对名称进行消毒:
def valid_sheet_names
Company.find(@company_id).asset_types.where.not(name: nil).pluck(:name)
names.map { |name| name.downcase.tr(' ._', '') }
end
基于@Sumak的@spickermann的答案
["hardware", "computer", "network", "mobile devices"].map do |asset_type|
asset_type.gsub(/[._s]/, '')
end
可以像这样插入到你的代码中
def valid_sheet_names
Company.find(@company_id).asset_types.pluck(:name).reject(&:nil?).map { |name| name.downcase.gsub(/[._s]/, '') }
end
这里首选gsub
,以利用元字符s
,它可以捕获任何类型的空格。
与在集合上使用map
的方式相同,您可以使用块来迭代它:
["hardware", "computer", "network", "mobile devices"].map do |asset_type|
asset_type.delete(' ')
.delete('_')
.delete('.')
end
你的函数可以像这样:
def valid_sheet_names
asset_types = Company.find(@company_id).asset_types.pluck(:name).reject(&:nil?)
# I'd personally extract normalization to a specific function or module
asset_types.map do |asset_type|
asset_type.downcase
.delete(' ')
.delete('.')
.delete('_')
end
end
您也可以使用gsub
(它支持正则表达式)。虽然我发现delete
更明确,当我们想…删除