0

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

现在,我编造的方式非常低效。

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

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

因此,我根据热度对数组进行排序并将其打印到页面上。这是错误的做法,而且性能现在还没有发生。

不过,我不确定有什么更好的方法。

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

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

4

1 回答 1

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

于 2013-02-16T12:54:39.843 回答