如何从字符串中有效地提取各种值

时间:2014-02-19 18:08:06

标签: ruby-on-rails ruby

我的端点操作采用字符串(源自短信)。

字符串可以包含:

  1. 字符串中用于标识商家的商家标记
  2. 员工徽章编号(1000-9999)和字符串
  3. 中的10分

    示例:

    • '4353 9'
    • '4353获得了9分的分数
    • '9 4353'
    • '得分9员工4353'
    • 'bizx thank you'
    • '谢谢你bizx'

    我无法控制用户输入。由于成本因素,我接受了两种类型的字符串。

    我有以下代码可以尝试提取徽章编号分数值或业务标记值。

    def endpoints
     if badge_number = get_badge_number(params[:text])
      if score = get_score(params[:text])
       //do something
      end
     elsif business_tag = get_business_tag(params[:text])
      // do stuff
     end
    end
    
    def get_badge_number(msg)
     msg.find do |badge_number|
      Employee.exists?(badge_number: badge_number.to_i)
     end
    end
    
    def get_score(msg)
     msg.find do |score|
      (1..10).include? score.to_i
     end
    end
    
    def get_business_tag(msg)
     msg.find do |tag|
      Business.exists?(tag: tag)
     end
    end
    

    正如你所看到的,它变得有点混乱。

    我真的需要帮助来有效地提取相关值。

1 个答案:

答案 0 :(得分:1)

您可以尝试创建几个类来处理字符串上的不同类型的数据,如:

ScoreSearcher,BadgeNumberSearcher和BusinessTagSearcher

其中每个人使用正则表达式处理搜索并返回对象(如果存在或为零)。然后在您的端点上,您只需要使用您获得的参数调用此模型,并在需要时使用对象“执行您的操作”。

这仍然有点令人困惑,但正如@Dave Newton所提到的,在一个简单的代码中更难以反映复杂的东西,所以在我看来,小型模型中的单独的东西是更好的主意,因为它会让你用小东西做小事。它也更容易测试。 = d