【问题标题】:Rails 3 - which sql query for related tagsRails 3 - 哪个sql查询相关标签
【发布时间】:2012-07-29 15:05:39
【问题描述】:

我现在计划这个功能很长时间了,但我真的无法开始使用它,因为我不知道如何用代码表达它。有时当我认为我明白了自己想要什么时,我突然又被困住了,一切都失去了意义。

我有标签和标签,所以一个 has_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

...我只是在这一点上感到困惑。

【问题讨论】:

    标签: sql ruby-on-rails-3 tags tagging


    【解决方案1】:

    我认为解决这个问题的最好方法是在标签之间建立多对多关系,所以一个标签可以有很多标签。然后在两个标签之间的关系中,存储它们一起出现的实例数。

    您也可以在每次标签出现在同一篇文章中时简单地创建一个新的标签到标签连接。然而,这会在数据库中产生一些冗余。

    如果你不想引入另一个表,你可以按照你开始的方式让它工作,只是它可能会非常慢,即使是相当少量的标签。但如果你不能建立标签到标签的连接,我会这样做:

    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    
    

    希望这会有所帮助:)

    【讨论】:

    • 非常感谢您的回答!使用 hash_storage 一切正常。但是,我认为您说得对,这可能不是最有效的方法。
    • 这段代码你花了多长时间?我不可能想出它.. 仍然对哈希和数组缺乏经验.. 现在我看到了你的代码,当然一切都有意义,但在此之前.. :) 再次感谢!
    • 写的时间不长。大概 5 分钟左右,但我之前基本上做过同样的事情,因此对我来说更容易:) 很高兴我能提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多