在我的Rails应用中,我正在使用acts_as_taggable_on
,我有一组固定的标签,可以同时应用于Users
和Posts
(相应的上下文为{{1} }和:user_tags
。
现在我要做的是根据在该上下文中使用它们的次数对每个上下文(用户和帖子)中的标记进行排名。
我试过了:
:post_tags
但是,它只返回已在特定上下文中使用过的标记列表至少一次。
我可以使用这个来轻松地返回和排列最常用的标签:
ActsAsTaggableOn::Tagging.where(:context => context).joins(:tag).select('DISTINCT tags.name').map{ |x| x.name}
但是,这是将两种情境中的计数结合起来创建排名,这是不准确的。应该有两个单独的排名:最常用于用户,最常用于帖子。如果标签“Developer”附加到某个帖子,则该标记应仅计入Post标记排名中的“Developer”,而不是用户标记排名。
答案 0 :(得分:1)
尝试
a = ActsAsTaggableOn::Tagging.where(context: :user_tags).includes(:tag).uniq(:tag_id).map{ |t| [ t.tag.name, User.tagged_with(t.tag.name).size] }.uniq
或
a = User.tag_counts_on(:user_tags).map{ |t| [ t.name, User.tagged_with(t.name).size] }.uniq
构建嵌套数组:[ ["tag_name1", frequency], ["tag_name2", frequency] ]
然后按频率对数组进行排序
a = a.sort_by{|a| -a[1]}
获取用户的有序排名列表。
主要缺点是将为每个标记执行User.tagged_with(t.tag.name).size
查询,这对于性能并不理想。也许有一种方法可以加载它。