2014-02-24 51 views
3

如何在檢查字符串是否唯一時忽略空格?例如,如果我的模型只存儲一個字符串,並且條目是「Hello World」,則應將「HelloWorld」標記爲非唯一。有沒有一種方法可以將此子句附加到驗證程序validates: uniqueness: ...,還是需要編寫我自己的方法?忽略Rails唯一性檢查中的空格

回答

3

你將不得不編寫您自己的方法:

before_save :check_name_uniqueness 

def check_name_uniqueness 
    name = self.name.presence 
    if name 
    name = name.downcase.gsub(" ", "").strip.squish 
    if self.class.exists?(name: name) 
     self.errors.add(:base, "already existing name") 
     return false 
    else 
     return true 
    end 
    else 
    self.errors.add(:name, "cant be blank") 
    return false 
    end 
end 
+0

感謝這個回答。我只是試圖實現它,但它允許我保存兩個名字,第一個字母是大寫,即'Hello world'和'hello world',它們是同一個條。有沒有一種快速的方法來檢查數據庫記錄的唯一性,忽略空間和首都?或者@T J的答案低於最佳解決方案? –

+1

你可以添加一個where子句:如果self.class.where(「LOWER(name)=?」,name).exists?'或PostgreSQL'如果self.class.where('name ILIKE?',name) ' – MrYoshiji

+0

謝謝,我稍後再嘗試 –

0

您也可以嘗試增加一個額外的列作爲一個唯一的列的使用和設置您的驗證,如:

before_validation :set_unique_name 
validates :unique_name, :uniqueness => {:message => "name is already taken"} 

def set_unique_name 
    self.unique_name = self.name.downcase.gsub(" ", "").strip 
end