使用Rails中的acts_as_taggable_on按上下文获取标记计数

时间:2015-01-23 23:08:30

标签: ruby-on-rails ruby acts-as-taggable-on

在我的Rails应用中,我正在使用acts_as_taggable_on,我有一组固定的标签,可以同时应用于UsersPosts(相应的上下文为{{1} }和:user_tags

现在我要做的是根据在该上下文中使用它们的次数对每个上下文(用户和帖子)中的标记进行排名。

我试过了:

:post_tags

但是,它只返回已在特定上下文中使用过的标记列表至少一次。

我可以使用这个来轻松地返回和排列最常用的标签:

ActsAsTaggableOn::Tagging.where(:context => context).joins(:tag).select('DISTINCT tags.name').map{ |x| x.name}

但是,这是将两种情境中的计数结合起来创建排名,这是不准确的。应该有两个单独的排名:最常用于用户,最常用于帖子。如果标签“Developer”附加到某个帖子,则该标记应仅计入Post标记排名中的“Developer”,而不是用户标记排名。

1 个答案:

答案 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查询,这对于性能并不理想。也许有一种方法可以加载它。