Rails中的排名算法优化

时间:2013-02-14 22:55:25

标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongoid

我需要使用Mongoid对Rails应用程序中的帖子进行排名,我正在寻找有关如何高效准确地进行操作的输入。

现在,我制作它的方式非常低效。

现在我正在根据这样的方法对模型进行排序:

def hotness
  return (self.confidence*(self.popularity+0.3))/Math.sqrt((Time.now - Time.at(self.created_at)))
end

然后我根据热度对数组进行排序并将其打印到页面。这是一种错误的方法,现在就没有发生这种情况。

我不确定如何更好地解决这个问题。

还有其他功能不需要时间调用,我可以想象不同的方法来做这些,但仍然喜欢输入。优化对我很重要。

提前多多感谢。如果需要,我可以澄清任何事情。

1 个答案:

答案 0 :(得分:0)

从上面的评论开始 - 如果这是可以在字段中缓存的结果,定期更新,或者保存模型 - 那么这是最好的方法(在查询性能方面) MongoDB的)。

所以你最终会得到这样的东西:

class Post
  include Mongoid::Document

  field :hotness, :type => Float, :default => 0
  field :confidence, :type => Float, :default => 0
  field :popularity, :type => Float, :default => 0

  before_save :refresh_hotness

  scope :hottest, desc(:hotness)

  protected
  def refresh_hotness
    self.hotness = (self.confidence*(self.popularity+0.3))/Math.sqrt((Time.now - Time.at(self.created_at)))
  end
end

然后,您可以使用Post.hottest抓取订购的“最热门”帖子。