【发布时间】:2012-01-26 11:27:09
【问题描述】:
因此,您在 Github 中提交了一个问题,并且您参考了问题 #31。然后,在撰写此问题时,您注意到@johnmetta 提出了一些他正在研究的可能解决方案。然后你点击“提交新问题”,当你这样做时,“#31”和“@johnmetta”是链接,@johnmetta 已经收到通知,问题 #31 有一个通知它已被引用。
我意识到这里有不止一种技术在起作用(Javascript 好东西等),但我正在寻找的是如何在 Rails 世界中做这类事情的一些示例。这是一个有趣的难以搜索的主题。
我从概念上想出的是:
- 有一些标识符,例如保留的# 或@
- 提交后,在相应属性中搜索该标识符
- 找到后,搜索具有与以下内容匹配的字段的适当模型
- 找到后,用链接替换该文本字符串
- 或者,做任何必要的事情来通知被引用的对象
也就是说,它似乎超级简单(显式编码,假定为friendly_id)。
def prettify_user_links(str, source):
result = str
str.scan(/(@\S+)+/).each do |mtch|
# Strip off whatever identifier we're using
search_string = mtch[0].gsub('@','')
# Search for the matching model in the appropriate table
user = User.find(search_string)
if user
# If we find a matching model, create some link text and link it
link_txt = "<a href=>'#{user.url}'>#{mtch}</a>"
result.gsub!(search_string, link_txt)
# Notification. Not sure how/where, maybe with a message bus, or something more brute-force like
Comment.create :user_id => user.id, :body => "You have been mentioned in #{link_to comment.excerpt, comment} by #{link_to comment.owner, owner}"
return result
那将是我的第一次剪辑,但我觉得必须有更优雅的解决方案。
这个问题的另一个方面:您将如何抓取周围文本的片段。蛮力方法是在该字符串之前搜索 n 个单词和在该字符串之后搜索 m 个单词并获取所有这些,然后从结果中获取该子字符串并进行搜索。不过,似乎会有更优雅的解决方案。
【问题讨论】:
标签: ruby-on-rails ruby search