#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"
Затем напишите небольшую функцию, чтобы преобразовать их в форму отображения для использования в представлениях.
Это заставит ваш запрос работать как есть.