2017-02-18 128 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活動記錄

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

另一種方法,可以使用一個正則表達式用於識別Email Formatparams[:email_or_phone_number]Phone Number Format但我還沒有遇到任何其在識別有格式的情況下,充分證明。

+0

ArgumentError(您已將Hash對象傳遞給#or。代替傳入ActiveRecord :: Relation對象): –

+0

上述語法與ODM ie Mongoid –

+0

你可以嘗試|| User.where(電子郵件:PARAMS [:email_or_phone_number]) 。或(User.where(PHONE_NUMBER:PARAMS [:email_or_phone_number])) –

1

你可以用正則表達式分割電子郵件或電話號碼。

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

如果x是零,那麼

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]}%") 

我不知道你的數據庫是什麼,但請記住,這個查詢可能在較大的數據集上表現不佳。如果是這種情況,我建議你看看pg_trgm(Postgres-only)或全文搜索解決方案。

相關問題