大多数DRY方法的Rails应用程序与大量的小计

时间:2013-02-19 01:55:17

标签: ruby-on-rails

我有一个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表中没有这些列,那么每次加载新用户页面(或缓存已过期)时似乎都是这样将不得不再次计算所有这些用户评论计数。

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

1 个答案:

答案 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

我认为你运行的查询不是那么糟糕但是你不会知道,直到你达到生产并扩大其效果。