2013-05-05 101 views
-1

下面是代碼:我在哪裏可以選擇忽略特殊字符與Regexp.new?

def autocomplete 
    if(params[:terms]) 

    key = params[:terms] 
    customers = Customer.where(:$or => [ 
     {:first_name => Regexp.new(/^#{key}/i)}, 
     {:last_name => Regexp.new(/^#{key}/i)}, 
     {:email => Regexp.new(/^#{key}/i)}, 
     #{:phone => Regexp.new(/^#{key}[d+]/i)}, 

     {:phone => Regexp.new(/^#{key.gsub(/\D+/,'')}/)}, 

     {:zip_code => key.to_i }, 
     {:street1 => Regexp.new(/#{key}/i)}, 
     {:street2 => Regexp.new(/#{key}/i)} 
    ] 
) 

由鐵皮人提出的GSUB方法讓我幾乎沒有 - 這條從搜索字符串的搜索,只有當任何非數字字符:在我的DB手機領域。

最後一個問題是數據庫中的phone域可能實際上包含非數字(我想讓用戶輸入他們想要的電話號碼),所以我需要暫時忽略破折號,米搜索(使用蒙戈find()方法)

不知道我是否應該在這個級別中的自動完成功能,或者我應該這樣做的autocomplete.js模塊中做到這一點...

摘要 - 我想要:phone.gsub(/ \ D + /,'')但gsub只適用於字符串,而不是像這樣的引用。

+0

你想要一個正則表達式模式,所以你可以匹配'808949',如果你通過'808-949'或反之亦然?不能以任何方式達到目標。我們需要您嘗試匹配的數據和輸入值的更好樣本。 – 2013-05-05 05:10:27

+1

如果你不是程序員,你可能不應該試圖修復錯誤。你有沒有考慮聘請某人? – pguardiario 2013-05-05 10:16:50

+1

我聘請的公司正在編寫代碼。我是上述代碼的可憐的非程序員所有者,並且盡我所能去學習和理解 - 獲得足夠的基礎以便能夠打電話廢話,而無需自己成爲開發人員。 我知道有足夠的人來問我比我更聰明的一個問題,我不明白。 – notaceo 2013-05-06 20:26:53

回答

2

有些事情,我看到:

Regexp.new(/^#{key}[d+]/i)} 

[\d+]是無稽之談。掉落周圍的[]

爲:

{:zip_code => key.to_i }, 

的郵政編碼不要轉換爲整數。一些郵政編碼是連字符的,這會降低結尾值。此外,除非您打算對數值執行數學運算,否則將其保留爲字符串。

什麼是$or?使用全局通常是代碼嗅覺的標誌。在Ruby中使用其中一個原因的原因很少,而且我從未在代碼中找到過很好的用法,並且通常可以使用常量輕鬆重構這些內容。


我想你實際上是通過指出key.to_i爲ZIP回答我的問題 - 這其實正是我想要做的電話號碼 - 去掉所有破折號,空格,支架等我打算試一試。

不,不,不,不。 to_i不會做你想要的。 '0-1'.to_i => 0'0.1'.to_i => 0。相反,你想用gsub剝離出從字符串中的所有非數字字符,那麼你就大功告成了:

'0.1'.gsub(/\D+/, '') 
=> "01" 
'123-456-7890'.gsub(/\D+/, '') 
=> "1234567890" 
'(123) 456 7890'.gsub(/\D+/, '') 
=> "1234567890" 

'0.1'.gsub(/\D+/, '').to_i 
=> 1 

注意上面發生了什麼事時to_i收到"01",前導零移除,因爲它不是對於Fixnum的表示很重要。你可以強制它使用字符串格式顯示,但爲什麼?電話號碼不是一個數值,它是一個字符串值,即使它是一堆數字。我們永遠不需要在它們或任何數學上進行加法,因此將它轉換爲整數是沒有意義的。將它保持爲一串數字。

+1

':$或'表明MongoDB正在使用中。同樣對於':$ in',':$ set',... – 2013-05-05 07:13:15

+0

Tin Man是對的,'[\ d +]'匹配'\ d'(數字)或'+',而'[d + '匹配'd'或'+'。這些是你不只是查看的東西,你需要一個堅實的基礎,然後才能解決這個問題。 – pguardiario 2013-05-05 10:44:03

+0

我想你實際上通過指出key.to_i爲ZIP來回答我的問題 - 這實際上正是我想要用電話號碼做的 - 去掉所有的破折號,空格,括號等等。我將試試這個。 – notaceo 2013-05-06 20:25:17

相關問題