2014-02-19 25 views
0

我的端点操作需要一个字符串(源自短信)。如何从字符串中有效地提取各种值

字符串可以包括:

  1. 字符串中的一个企业标签,它会识别业务
  2. 的员工工号(1000-9999)和字符串
  3. 内的比分淘汰10

实例:

  • '4353 9'
  • '4353得到了比分淘汰的9'
  • '9 4353'
  • '进球9员工4353'
  • 'bizx谢谢'
  • '谢谢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 

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

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

+2

当输入可能是一团糟时,通常提取有意义数据的解决方案也是如此。提取数字可以用正则表达式分组完成。提取名字将是一个痛苦。 –

回答

1

您可以尝试创建多个类像字符串处理不同类型的数据:

ScoreSearcher,BadgeNumberSearcher和BusinessTagSearcher

每个那些通过使用正则表达式处理搜索和返回,如果对象存在或无。然后在你的端点上,你只需要用你得到的参数来调用这个模型,如果需要的话就用对象“做你的事情”。

这仍然有点复杂,但正如@Dave Newton所说,它很难在简单的代码中反映一些复杂的东西,所以在我看来,小型模型中的独立事物是更好的想法,因为它可以让你小做小事情的东西。它也更容易测试。 = D

+0

感谢Paulo。我将不得不在这一个上开一笔赏金,不是吗? – grabury

+0

为什么要开一个赏金?你想要更具体的答案吗? –

+0

我需要帮助正确和高效地提取变量。 – grabury