我需要从字符串中删除一些字符(计算机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
答案 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