用户发送必须包含关键字的微笑。然后,此关键字用于查找商家。
该指令是在句子的开头使用关键字。
我知道有些用户不会在开头使用该关键字,或者会在关键字中添加标签(#@ - )或标点符号(keyword。)。
查找此关键字和业务的有效方法是什么?
我的尝试:
scrubbed_message = msg.gsub("\"", "").gsub("\'", "").gsub("#", "").gsub("-", "").gsub(",", "").gsub(".", "").gsub("@", "").split.join(" ")
tag = scrubbed_msg.split[0]
if @business = Business.where(tag: tag).first
log_message(@business)
else
scrubbed_msg.split.each do |w|
if @business = Business.where(tag: w).first
log_message(@business)
end
end
end
答案 0 :(得分:1)
您可以使用Regexp
匹配来过滤String
中的所有不必要字符,然后使用#reduce
git from splitted string中的Array
方法获取第一个出现的问题标记字段与关键字匹配的记录,例如:关键字,tag1,tag2 :
msg = "key.w,ord tag-1'\n\"tag2"
# => "key.w,ord tag-1'\n\"tag2"
scrubbed = msg.gsub(/[#'"\-\.,@]/, "").split
# => ["keyword", "tag1", "tag2"]
@business = scrubbed.reduce(nil) do| sum, tag |
sum || Business.where(tag: tag).first
end
# => Record tag: keyword
# => Record tag: tag1 if on record with keyword found
答案 1 :(得分:1)
我建议您使用白名单方法指定要保留哪些字符,例如字母数字字符,而不是要从字符串中删除哪些字符:
sms = "#keyword and the rest"
clean_sms = sms.scan(/[\p{Alnum}]+/)
# => ["keyword", "and", "the", "rest"]
然后,如果我做对了你想要做的事情,找到你正在寻找的事业你可以这样做:
first_existing_tag = clean_sms.find do |tag|
Business.exists?(tag: tag)
end
@business = Business.where(tag: first_existing_tag).first
log_message(@business)