将名称保存为唯一名称而不更改其当前大小写

save name as an unique without change its current case

我们在验证唯一列创建时遇到问题

问题是我们已经有了一个字段名"Stack Overflow"

现在我可以检查是否有人输入 "Stack Overflow" 或 "STACK OVERFLOW" 或 "stack overflow" 我们不允许用户创建该字段。

但是当有人在 "Stack Overflow" 之间放置更多 space 时,它会保存 space 并与 space 一起保存,因此它不会检查字段的唯一性。

我们正在使用此代码进行唯一列检查

self.unique_columns = self.unique_columns + additional_unique_columns.each_line.collect(&:strip).map(&:downcase).uniq.select{|column| !self.unique_columns.map(&:downcase).include?(column.downcase)}

谁能建议我们如何检查这种情况?

您可以使用正则表达式将两个单词之间任意数量的白色 space 替换为一个 space 以保持一致。此外,您可以使用 String#strip 方法去除所有前导和尾随的白色 spaces:

> 'Stack Overflow'.gsub(/\s+/, ' ').strip
# => "Stack Overflow"
> 'Stack   Overflow'.gsub(/\s+/, ' ').strip
# => "Stack Overflow"
> 'Stack        Overflow'.gsub(/\s+/, ' ').strip
# => "Stack Overflow"
> '    Stack        Overflow    '.gsub(/\s+/, ' ').strip
# => "Stack Overflow"

所以,以上所有returns相同的Stack Overflow字符串,可以认为是唯一的。

更新

正如@Arv 已经提到的,squish 是解决这个问题的方法,因为它将删除字符串两端的所有白色space,然后更改剩余的连续白色space组,每组space。

我已经看到了答案,但如果我们的名称前后都带有 space,则无法解决问题。

我用 squish

完成了
columns = self.unique_columns.map{|i| i.downcase.squish}
self.unique_columns = self.unique_columns + additional_unique_columns.each_line.collect(&:strip).select{|column| !columns.include?(column.downcase.squish)}

分享其他答案