我目前正在为我的Rails应用程序实现趋势主题。
我现在拥有的是:
每个帖子都有topic
属性,描述其主题的2到3个字。
然后我根据他们的观看次数得到了顶级帖子(我也喜欢和收藏夹可用,但暂时只使用视图):
def trending_topics
Post.order("COALESCE(impressions_count, 0) DESC").limit(200)
end
然后我所做的只是选择唯一的主题并显示其中的一些:
<% trending_topics.select(:topic).map(&:topic).uniq.take(10).each do |topic| %>
<li><%= topic %></li>
<% end %>
我的问题是:
:topic
,对它们进行排名,
并选择那些作物的奶油?:topic
属性?答案 0 :(得分:0)
回答你的问题:
(1)是的,您可以获得每个:topic
频率的哈希值,如下所示:
array = trending_topics.select(:topic).map(&:topic)
freq = array.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
# => {'topic1'=>3, 'topic2'=>3, 'topic3'=>1, ...}
(2)这是“可持续的”,因为随着您引入的帖子/主题数量的增加,它不会增加复杂性(因为您仍在前200个帖子中提取样本)虽然随着帖子数量的增加,获得“前200名”会占用更多的计算时间。
(3)我认为impressions_count
不是一个很好的方法来跟踪趋势,因为对我来说impressions_count
的总数是印象,虽然你想要它的一些时间方面(例如impressions_this_week
)。
因此,一种方法是引入定期更新的impressions_this_week
列。然后你可以根据它进行选择。
另一种方法是编写一个方法,使用整体impressions_count
以及created_at
或updated_at
时间戳来计算帖子的“热门”程度。您可以使用简单的衰减函数执行此操作,然后调整该函数的常量,直到获得所需的衰减。这里显示的概念类似于http://blog.notdot.net/2009/12/Most-popular-metrics-in-App-Engine。一旦编写了该方法,就可以根据其输出进行排序。
答案 1 :(得分:0)
如果您需要比当前排名算法更复杂的东西,您应该看看how sites like reddit和hackernews处理此问题。它相当复杂,但是如果你谷歌的话,你应该能够在Ruby中找到每种算法的实现。