私はまだ 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
今、私がやろうとしている残りのことはもう少し複雑です:
投稿を指定すると、他のすべての投稿のリストを取得します。このリストは、他の投稿が特定の投稿と共通するタグの数で並べ替えられます。
投稿のすべての可能なペアのリストを、共通のタグの数で並べ替えて取得します。したがって、共通タグが最も多いペアが最初になり、共通タグがないペアが最後になります。
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" の方法があるかどうか疑問に思っています。
何か案は?私は感謝されます。