Rails:可扩展的方式,可以按大多数标签进行排序

时间:2012-06-08 05:28:49

标签: sql ruby-on-rails ruby-on-rails-3 activerecord has-many-through

请原谅我仍然是一个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. 获取所有可能的帖子列表,按照共同的标签数排序。因此,具有最多共同标签的对是第一个,没有共同标签的对是最后一对。

  3. 假设我有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有4个与P1共同的标签,P3共有3个标签,等等。

    Func2()应该返回:     [P1,P4],[P2,P3],[P1,P3],[P1,P2],[P3,P4],[P2,P4] ...前两对共有4个标签,最后一对只有一个共同。

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

    有什么想法吗?我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用acts-as-taggable-onrocket_tag等宝石。他们有这方面的功能。如果您仍想自己动手,请查看它是如何实现的。如果您使用postgresql(最新版​​本除外)并提及“group by”语句中的所有列,也要小心。据我所知acts-as-taggable-on负责此问题here