![](/img/trans.png)
[英]ActiveRecord: query attribute but ignore special characters and case
[英]Where do I put the option to ignore special characters with 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)}
]
)
Tin Man建議的gsub方法幾乎可以解決我的問題-僅在數據庫的:phone字段中搜索時,它才會從搜索字符串中刪除所有非數字字符。
最后一個問題是數據庫中的:phone字段中實際上可能包含非數字(並且我想允許用戶隨意輸入電話號碼),因此在搜索(使用時,我需要暫時忽略破折號)在Mongo中的find()
不知道是否應該在此級別的autocomplete函數中執行此操作,還是應該在autocomplete.js模塊中執行此操作...
簡介-我想要:phone.gsub(/ \\ D + /,''),但gsub僅適用於字符串,而不適用於此類引用。
我看到的一些東西:
Regexp.new(/^#{key}[d+]/i)}
[\\d+]
是廢話。 刪除周圍的[]
。
對於:
{:zip_code => key.to_i },
不要將郵政編碼轉換為整數。 一些郵政編碼是帶連字符的,這將刪除尾隨的值。 另外,除非打算對值進行數學運算,否則請將其保留為字符串。
什么是$or
? 使用全局通常是代碼異味的標志。 在Ruby中使用一個的理由很少,而且我從未在代碼中找到一個很好的用途,而且通常可以使用常量輕松地重構它。
我想您實際上是通過指出ZIP的key.to_i來回答我的問題的-實際上這正是我想使用的電話號碼-刪除了所有的破折號,空格,方括號等。我將嘗試一下。
不不不不。 to_i
不會做你想要的。 '0-1'.to_i => 0
和'0.1'.to_i => 0
。 相反,您想使用gsub
從字符串中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的表示並不重要。 您可以強制使用字符串格式顯示它,但是為什么呢? 電話號碼不是數字值,而是字符串值,即使它是一堆數字。 我們永遠不需要對它們進行加法運算或任何數學運算,因此將其轉換為整數是毫無意義的。 將其保留為一串數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.