请原谅我仍然是一个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有4个与P1共同的标签,P3共有3个标签,等等。
Func2()应该返回: [P1,P4],[P2,P3],[P1,P3],[P1,P2],[P3,P4],[P2,P4] ...前两对共有4个标签,最后一对只有一个共同。
我意识到这两个方面,我可以迭代,在代码中进行一些手动计数和排序,但我想知道是否有更好,更具伸缩性的“Rails”方式,可以更好地利用ActiveRecord和SQL ?
有什么想法吗?我将不胜感激。
答案 0 :(得分:0)
您可以使用acts-as-taggable-on或rocket_tag等宝石。他们有这方面的功能。如果您仍想自己动手,请查看它是如何实现的。如果您使用postgresql(最新版本除外)并提及“group by”语句中的所有列,也要小心。据我所知acts-as-taggable-on负责此问题here。