-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 メソッドは、ほとんどそこに到達します。DB の :phone フィールドで検索する場合にのみ、検索文字列から数字以外の文字を取り除きます。

最後の問題は、DB の :phone フィールドに実際には非数字が含まれている可能性があることです (そして、ユーザーが好きなように電話番号を入力できるようにしたい) ため、検索するときにダッシュを一時的に無視する必要があります ( find() モンゴ)

autocomplete 関数でこのレベルで行うべきか、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 に答える