Как использовать ilike для фильтра телефонных номеров

#ruby-on-rails

#ruby-on-rails

Вопрос:

Привет, я извлекаю пользовательский ввод и отображаю записи, соответствующие условию, мой запрос будет выглядеть так

 customers = customers.where('customers.contact_num ilike :search', {search: "%#{options[:search_contact]}%"})
 

здесь в БД контактный номер хранится в виде строки в формате (091)-234-5678, например

при поиске пользователя на основе контактного номера, если я ищу так

091 он правильно фильтрует номер, но при поиске, например, 0912, он не отображает запись из-за фигурных скобок, поэтому как изменить запрос, чтобы пренебречь ) и — во время поиска.. Поскольку я новичок в домене, пожалуйста, помогите мне

заранее спасибо

Комментарии:

1. Возможно ли преобразовать телефонные номера в базе данных в формат e164? Возможно, с помощью phonelib? Вам придется очистить существующие данные, очистить входящие новые данные и отформатировать числа в представлениях, но ваш поиск станет проще (и в будущем будет проще взаимодействовать со службами, основанными на телефонных номерах).

2. Пожалуйста, не злоупотребляйте тегами версий — они не являются украшениями и не привлекут к вашему вопросу никакого дополнительного внимания. Тег version следует использовать только для предоставления контекста, в котором ваш вопрос касается конкретной версии rails.

Ответ №1:

Как насчет использования REGEXP_REPLACE для удаления всех нецифровых символов из поиска — что-то вроде приведенного ниже?

customers = customers.where("REGEXP_REPLACE(customers.contact_num,'[^[:digit:]]','','g') ilike :search", {search: "%#{options[:search_contact]}%"})

Комментарии:

1. каким будет значение digit, должны ли мы упоминать какой-либо индекс по этому поводу? поскольку я новичок, могу ли я уточнить запрос, если это возможно, спасибо -джеган @obiruby

2. Никаких изменений не требуется — вы должны иметь возможность скопировать / вставить фрагмент кода, и (надеюсь) он просто будет работать. Смотрите postgresql.org/docs/9.4/functions-matching.html

Ответ №2:

Изменить запрос сложно. Давайте не будем этого делать.

Вместо этого используйте быстрый скрипт для преобразования ваших номеров в форму 1112223333. Никакого форматирования вообще. Что-то вроде:

 require 'set';
phone = "(234)-333-2323"
numbers = Set.new(["1","2","3","4","5","6","7","8","9","0"])
output = phone.chars().select{|n| numbers.include?(n)}.join("")
puts output
=> "2343332323"
 

Затем напишите небольшую функцию, чтобы преобразовать их в форму отображения для использования в представлениях.

Это заставит ваш запрос работать как есть.