【问题标题】:How to parse email or phone number parameter?如何解析电子邮件或电话号码参数?
【发布时间】:2017-02-18 11:20:03
【问题描述】:

参数 email_or_phone_number 来自客户端,我需要这个来进行身份验证。但是,该模型分别具有 emailphone number 字段。

解析 email_or_phone_number 属性的正确方法是什么,然后我可以使用 find_by 来查找用户?

find_by(email: email, phone_number: phone_number)

如果是号码,则应为 phone_number,但如果不是,则应为 email

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    对于您的问题,一个简单易读的解决方案是使用 OR 查询

    Mongoid

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

    更新活动记录

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

    另一种方法可能是使用正则表达式来识别Email FormatPhone Number Format 中的params[:email_or_phone_number] 值,但我还没有遇到任何可以完全证明的方法来识别其中的格式。

    【讨论】:

    • ArgumentError(您已将 Hash 对象传递给 #or。改为传递 ActiveRecord::Relation 对象。):
    • 以上语法是按照ODM,即Mongoid
    • 你可以试试 || User.where(email: params[:email_or_phone_number]) .or(User.where(phone_number: params[:email_or_phone_number]))
    • 这已经奏效了,这是一个很好的解决方案!请更新答案!
    【解决方案2】:

    您可以使用正则表达式拆分电子邮件或号码。

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

    如果 x 为零,则

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

    else: 输入无效!保存结果并将res传递给find_by

    【讨论】:

      【解决方案3】:

      假设期望的行为是搜索123 匹配greg123@example.com(电子邮件)和123123123(电话号码),那么正确的查询是:

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

      我不确定您的数据库是什么,但请记住,此查询在较大的数据集上可能表现不佳。如果是这种情况,我建议您查看pg_trgm(仅限 Postgres)或全文搜索解决方案。

      【讨论】:

        猜你喜欢
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 2019-10-20
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多