【问题标题】:save name as an unique without change its current case将名称另存为唯一名称而不更改其当前大小写
【发布时间】:2015-11-25 03:23:21
【问题描述】:

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

问题是我们已经有一个字段名“Stack Overflow”

现在我可以检查是否有人放了“堆栈溢出”或“堆栈溢出”或“堆栈溢出”,我们不允许用户创建该字段。

但是当有人在“堆栈溢出”之间放置更多空间时,它会节省与该空间一起保存的空间,因此它不会检查字段的唯一性。

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

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)}

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model


    【解决方案1】:

    我已经看到了答案,但如果我们的名字前后都有空格,那并不能解决问题。

    我已经用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)}
    

    如果有其他答案,请分享

    【讨论】:

    • 即使我的回答会奏效。但是,是的,squish 是适合您的用例的方法:)
    【解决方案2】:

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

    > '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"
    

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

    更新

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

    【讨论】:

    • 我已经看到了,但如果我们在字符串的前面和最后一个空格,它不能解决问题,我已经更新了代码
    • 在这种情况下,您也可以去掉前导和尾随空格。请参阅我的更新答案。
    • 是的,但是既然我们可以用 squish 做到这一点,为什么还要这样做呢?
    • 是的,squish 绝对是为此目的更好的解决方案,您应该使用它。尽管我以前在我的项目中使用过 squish,但由于某种原因,我并没有想到这一点。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多