-1

这是代码:

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 中找到())

不知道我是否应该在自动完成功能的这个级别执行它,或者我是否应该在 autocomplete.js 模块中执行它......

摘要 - 我想 :phone.gsub(/\D+/,'') 但 gsub 仅适用于字符串,而不是这样的参考。

4

1 回答 1

2

我看到的一些事情:

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,然后您就完成了:

'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 的表示并不重要。您可以强制它使用字符串格式显示,但为什么呢?电话号码不是数字值,而是字符串值,即使它是一堆数字。我们永远不需要对它们进行加法运算或任何数学运算,因此将其转换为整数是没有意义的。将其保留为一串数字。

于 2013-05-05T05:19:33.237 回答