我现在正在计划这个功能很长一段时间,我真的无法开始使用它,因为我不知道如何在代码中表达它。有时当我认为我得到它并知道我想要什么时,我突然再次陷入困境,一切都停止了。
我有标签和标签,所以a_many与文章的关系。你可以调用article.tags和tag.articles。
现在,每个标签都有自己的显示页面,基本上就像stackoverflow一样。在这个节目网站上,我想列出相关标签等。我对这些相关标签的处理方法是,它应该是那些标签,通常也会被标记在一篇文章中,该文章用show标签标记。我希望这是有道理的。
示例:我在/ tags / obama上,因此相关标签应该是最常用于文章的标签,包括标签obama。如果我有4篇文章,其中3篇包括'obama',并且所有这3篇文章都包含了标签'united_states',那么标记'obama'的最相关标签将是'united_states'。对不起,如果我很罗嗦..
我甚至不确定,如果这是找到相关标签的最佳方法,但这个想法对我来说很好。但是,我无法实现它。
首先,我需要获取包含show标签的所有文章。所以tag.articles。但是下一步又是什么呢?
tag.articles.each do |article|
article.tags
...我现在只是感到困惑。
答案 0 :(得分:1)
我认为解决此问题的最佳方法是在标签之间建立多对多的关系,因此标签可以包含许多标签。然后在两个标记之间的关系中,存储它们一起出现的实例数。
每次在同一篇文章中出现标记时,您也可以简单地创建一个新的标记到标记连接。但是,这会在数据库中创建一些冗余。
如果你不想引入另一个表,你可以按照你开始的方式使用它,除非它可能非常慢,即使是相当少量的标签。但是如果你不能建立一个Tag-to-tag连接,我就会这样做:
hash_storage = Hash.new(0) #0 is the default value
tag.articles.each do |article|
if article.tags.each do |t|
#we now know that this tag "t" is in the same article as our original tag
if t!=tag #we don't care if t actually the same as our original tag
hash_storage[t]+=1
end
end
end
#Now, this is a bit messy, but we need to sort the hash.
ordered_tags = hash_storage.map{|k,v| [v,k]}.sort.reverse.map{|a,b| b} #there might be a smarter way of doing this.
ordered_tags.each do |t|
#do whatever. the tags should now be ordered by their relative frequence of occurrance together with the initial tag.
end
希望这会有所帮助:)