0

我有一个 Rails 应用程序,它记录了许多 Movie_Categories 的用户、评论数。模型如下所示:

class User < ActiveRecord::Base
  has_many :comments
end

class Movie < ActiveRecord::Base
  belongs_to :movie_category

  has_many :comments
end

class MovieCategory < ActiveRecord::Base
  has_many :movies  
end

class Comment < ActiveRecord::Base
  belongs_to :movie
  belongs_to :user
end

我当然可以通过 MovieCategory 为每个 MovieCategory 执行类似的操作来查找用户评论数:

@user.comment.where("movie_category_id =?", movie_category_id)

但是,如果我需要过于频繁地进行此调用,它会给服务器带来很多负载,所以我正在考虑为所有 Movie_Categories 的所有用户每小时进行一次计算(在后台作业中),然后存储计数在用户表中,每个电影类别都有自己的列。这样,我就不必频繁地为每个用户运行计算,而只需访问 User 表中的计数。

我想知道是否有更干的方法来做到这一点,因为我不确定我的 Movie_Categories 何时会停止增长(并且每次都会出现一个新的表字段)。我还考虑过缓存用户显示视图(这些计数出现的位置),但即便如此,如果我在用户表中没有这些列,那么似乎每次加载新用户页面(或缓存过期)时它将不得不再次为用户评论计数计算所有这些。

对于我所面临的问题,是否有更好的方法来避免给服务器带来太多负担?

4

1 回答 1

0

鉴于您对目前正在开发中的评论,我会说在您不得不担心它之前不要担心它!但是,如果您想提前计划,我的建议是在外键上使用片段缓存和索引。

如果您的网站增长到您所说的大小,运行迁移以向您的用户表添加其他字段可能需要大量时间。

我注意到您在问题中提到了缓存,因此假设您对它非常熟悉,但给出了如下观点:

<ul>
  <li>Action Movies: 23 Comments</li>
  <li>Comedy Movies: 14 Comments</li>
</ul>

您可以将其包装在一个cache块中:

<% cache "user-#{user.id}-comments", @user.comments.last.created_at.to_i  do %>
  ...
<% end %>

这将缓存显示计数的片段,并在该用户每次发布新评论时自动过期。<li>您可以通过缓存每个内容并仅在该类别中发布评论时才过期,从而真正获得详细的细节,但在早期阶段可能会过度杀伤力。

对于外键上的索引,您可以使用以下语法将其添加到迁移中:

add_index :comments, :movie_category_id

我认为您运行的查询并没有那么糟糕,但是您永远不会知道直到您投入生产并扩展它会产生什么影响。

于 2013-02-19T11:17:25.483 回答