1

私はこの機能を長い間計画していますが、コードで表現する方法がわからないため、実際に始めることはできません。手に入れて自分が何を欲しているか分かっていると思っていたのに、突然また閉じ込められて、すべてが意味をなさなくなってしまうことがあります。

私はタグとタグ付けを持っているので、記事との関係を通じて has_many です。article.tags と tag.articles を呼び出すことができます。

現在、各タグには基本的にスタックオーバーフローのような表示ページがあります。そして、この番組サイトでは、関連するタグなどをリストアップしたいと考えています。これらの関連タグに対する私のアプローチは、show タグでタグ付けされた記事で、ほとんどの場合同様にタグ付けされているタグであるべきだということです。これが意味をなすことを願っています。

例: 私は /tags/obama を使用しているので、関連するタグは、タグ obama を含む、記事で最も頻繁に使用されるタグにする必要があります。たとえば、記事が 4 つあり、そのうちの 3 つに「オバマ」が含まれており、その 3 つすべてに「united_states」というタグが含まれていた場合、「obama」というタグに最も関連するタグは「united_states」になります。言葉足らずですみません..

これが関連するタグを見つけるための最良のアプローチであるかどうかはわかりませんが、このアイデアは私にとってはうまくいきます。しかし、私はそれを実装することはできません。

最初に、show タグを含むすべての記事を取得する必要があります。だからtag.articles. しかし、次のステップは何ですか?

tag.articles.each do |article|
  article.tags

... この時点で混乱しています。

4

1 に答える 1

1

これを解決する最善の方法は、タグ間に多対多の関係を持たせることだと思います。これにより、タグは多くのタグを持つことができます。次に、2 つのタグ間の関係で、それらが同時に発生するインスタンスの数を格納します。

また、同じ記事内でタグが発生するたびに、新しいタグ間接続を作成することもできます。ただし、これによりデータベースに冗長性が生じます。

別のテーブルを導入したくない場合は、かなり少量のタグでも非常に遅くなる可能性があることを除いて、最初の方法でこれを機能させることができます。ただし、タグ間接続を作成できない場合は、次のようにします。

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    

お役に立てれば :)

于 2012-07-29T15:50:29.837 に答える