请原谅我仍然是一个 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,我可以找到它们的共同标签:
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共同的标签,最后一对只有一个共同点。
我意识到对于这两个,我可以迭代,在代码中进行一些手动计数和排序,但我想知道是否有更好、更具可扩展性的“Rails”方式可以更好地利用 ActiveRecord 和 SQL?
有任何想法吗?我将感激不尽。