我有一个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 Category都有自己的列。这样,我不必经常为每个用户运行计算,只能从User表访问计数。
我想知道的是,如果有更干的方法可以做到这一点,因为我不确定我的Movie_Categories何时会停止增长(并且每次都会出现一个新的表格字段)。我还考虑过缓存用户节目视图(这些计数出现的位置),但即便如此,如果我在User表中没有这些列,那么每次加载新用户页面(或缓存已过期)时似乎都是这样将不得不再次计算所有这些用户评论计数。
对于我所面临的问题,是否有更好的方法,不会给服务器带来太多负担?
答案 0 :(得分:0)
鉴于您对目前处于开发阶段的评论,我会说在您不必担心之前不要担心它!但是,如果您想提前计划,我的建议是使用fragment caching和外键索引。
如果您的网站增长到您所讨论的规模,那么运行迁移以向用户表添加其他字段可能会花费大量时间。
我注意到你在你的问题中提到了缓存,所以假设你对它很熟悉,但给出的观点如下:
<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
我认为你运行的查询不是那么糟糕但是你不会知道,直到你达到生产并扩大其效果。