1

私はまだ Rails の初心者ですが、has_many を使用した基本的なタグ付けシステムは次のようにして作成しました。

class Post < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :posts, :through => :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :post
  belongs_to :tag
  [...]
end

post1 と post2 という 2 つの投稿がある場合、どのタグが共通しているかを見つけることができます。

post1.tags & post2.tags

そして、共通点がいくつあるか数えます。

(post1.tags & post2.tags).count

今、私がやろうとしている残りのことはもう少し複雑です:

  1. 投稿を指定すると、他のすべての投稿のリストを取得します。このリストは、他の投稿が特定の投稿と共通するタグの数で並べ替えられます。

  2. 投稿のすべての可能なペアのリストを、共通のタグの数で並べ替えて取得します。したがって、共通タグが最も多いペアが最初になり、共通タグがないペアが最後になります。

N 件の投稿があるとすると、リスト 1 は N-1 件の投稿を返し、リスト 2 は N(N-1)/2 件の投稿を返す必要があります。したがって、単純なセットの場合:

P1: tags A B C D E
P2: tags A   C     F G
P3: tags A   C D   F G
P4: tags   B C D E

Func1(P1) は、P4、P3、P2 を返す必要があります。P4 には P1 と共通のタグが 4 つあり、P3 には共通のタグが 3 つあるなどです。

Func2() は次を返す必要があります: [P1,P4], [P2,P3], [P1,P3], [P1,P2], [P3,P4], [P2,P4] ...4 を持つ最初の 2 つのペアタグは共通で、最後のペアには共通点が 1 つだけあります。

これらの両方について、コードで手動のカウントとソートを繰り返すだけでよいことを認識していますが、ActiveRecord と SQL をより有効に活用する、よりスケーラブルな "Rails" の方法があるかどうか疑問に思っています。

何か案は?私は感謝されます。

4

1 に答える 1

0

acts-as-taggable-onrocket_tagなどのgemを使用できます。そのための機能があります。それでも自分でやりたい場合は、そこでどのように実装されているかを見てください。また、postgresql (最新バージョンを除く) を使用しており、「group by」ステートメントですべての列に言及している場合も注意してください。私の知る限り、acts-as-taggable-onがこの問題をここで処理します。

于 2012-06-08T13:49:34.523 に答える