2017-02-18 16 views
0

Параметр email_or_phone_number происходит с клиентской стороны, и мне нужно это для аутентификации. Однако, модель имеет электронная почта и номер телефона полей отдельно.Как проанализировать параметр электронной почты или номер телефона?

Каков правильный способ разобрать атрибут email_or_phone_number, так что я мог бы использовать find_by для поиска пользователя?

find_by(email: email, phone_number: phone_number) 

Если это число, то оно должно стать phone_number, но если это не так, то, что должно быть электронной.

ответ

2

Простой читаемым решение для Вашего вопроса будет с помощью ИЛИ запрос

Mongoid

User.where(email: params[:email_or_phone_number]) 
    .or(phone_number: params[:email_or_phone_number]) 
    .first 

UPDATE Active Record

User.where(email: params[:email_or_phone_number]) 
    .or(User.where(phone_number: params[:email_or_phone_number])) 

Другой метод может использовать Regex для идентификации Email Format или Phone Number Format значения в params[:email_or_phone_number], но я не сталкивался с каким-либо полным доказательством в случае идентификации там форматов.

+0

ArgumentError (вы передали объект Hash на # или. Передайте вместо него объект ActiveRecord :: Relation.): –

+0

Вышеупомянутый синтаксис соответствует ODM, т.е. Mongoid –

+0

вы можете попробовать || User.where (email: params [: email_or_phone_number]) .or (User.where (phone_number: params [: email_or_phone_number])) –

1

Вы можете разделить электронную почту или номер с помощью регулярного выражения.

x = {email_or_phone_number:"3333"} 
x[:email_or_phone_number].match(/^\d+/) 

если х равен нулю, то

x[:email_or_phone_number].match(/\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i) 

еще: не действует вход! Сохранить результат и передать рес к find_by

+0

Спасибо, приятель! –

+0

Добро пожаловать: D – sirion1987

+0

если ответ верный, нажмите на звезду: D – sirion1987

1

Предполагая, что желаемое поведение, что поиск 123 спичек и [email protected] (по электронной почте) и 123123123 (телефонный номер), то правильный запрос будет:

User.where('email ILIKE :q OR phone ILIKE :q', 
      q: "%#{params[:email_or_phone]}%") 

I «Не знаю, что такое ваша база данных, но помните, что этот запрос может плохо работать в больших наборах данных. Если это так, я рекомендую вам взглянуть на pg_trgm (Postgres-only) или полнотекстовые поисковые решения.