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,我可以找到它们的共同标签:

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共同的标签,最后一对只有一个共同点。

我意识到对于这两个,我可以迭代,在代码中进行一些手动计数和排序,但我想知道是否有更好、更具可扩展性的“Rails”方式可以更好地利用 ActiveRecord 和 SQL?

有任何想法吗?我将感激不尽。

4

1 回答 1

0

你可以使用像acts-as-taggable-onrocket_tag 这样的 gem 。他们有这方面的功能。如果你仍然想自己做,看看它是如何在那里实现的。如果您使用 postgresql(最新版​​本除外)并在“group by”语句中提及所有列,也要小心。据我所知,acts-as-taggable-on在这里解决了这个问题。

于 2012-06-08T13:49:34.523 回答