使用gsub清理字符串然后截断

时间:2012-01-28 22:38:24

标签: ruby-on-rails ruby-on-rails-3

我需要从字符串中删除一些字符(计算机mac地址+垃圾...)并截断以保留前18个字符。

目前,我的模型中有以下内容:

def popular_locations
  popular_locations =  Radacct.group(calledstationid).order('calledstationid desc').count
end

输出一个列表及其计数,但格式需要调整以进行搜索。

我尝试添加这个:

 clean_mac_address = :calledstationid.gsub(/[^0-9a-z]/i, '')

但是我得到一个错误的未定义方法`gsub':calledstationid:Symbol

- 编辑 -

最初,calledstationid存储在db(radacct模型)中,格式如下:

 00-18-0A-21-44-7B:Home Office

这基本上是一个mac地址加上一个SSID名称。

我需要删除破折号和SSID,因为我们有另一个模型(位置),其中包含此格式的mac地址列表:

 00:18:0A:21:44:7B

位置和radacct是不相关的(radacct是所有会话被转储到的模型)。最后,我需要做的是通过callstationid计算所有会话和分组(如上所示)。然后我们将查询位置表并计算出位置名称。我应该留下这样的东西:

 location_name     session_count
 School            2
 Home              12
 Office            89

2 个答案:

答案 0 :(得分:1)

当模型定义没有错误时,我不确定如何将错误的:放在那里:

clean_mac_address = calledstationid.gsub(/[^0-9a-z]/i, '')

您可能要做的是在传递之前清理该变量:

def popular_locations
  # Clean up calledstationid
  calledstationid.gsub!(/[^0-9a-z]/i, '')

  # Find it and return
  Radacct.group(calledstationid).order('calledstationid desc').count
end

答案 1 :(得分:1)

我认为popular_location是ActiveSupport :: OrderedHash类的对象,其中带有callstationid作为键。 所以,如果我理解你,请尝试

result =  Radacct.group(calledstationid).order('calledstationid desc').count
result.each do |key, value| 
   puts key.gsub(/[^0-9a-z]/i, '') # formatted key
   puts value  # count
end

我认为还有sql-way来做到这一点。您应该从calledstationid中选择子字符串,然后按其分组。 查看此文章http://www.ke-cai.net/2009/06/mysql-group-by-substring.html