2013-02-19 53 views
0

的地段大部分DRY方法我有一個Rails應用程序,保持用戶的數量,評論對許多Movie_Categories。該模型是這樣的:爲Rails應用程序與小計

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每小時進行一次計算(在後臺作業中),然後將計數存儲在用戶表中,每個電影類別都有自己的列。這樣,我不必爲每個用戶頻繁運行計算,只需從用戶表訪問計數。

我想知道的事情是,如果有要做到這一點,因爲我不知道,當我Movie_Categories將停止生長較爲乾燥的方式(每次用自帶的新表字段)。我也想過緩存User show視圖(這些計數出現的位置),但即便如此,如果我在User表中沒有這些列,那麼似乎每次加載新的用戶頁面(或緩存過期)將不得不通過計算所有這一切再次爲用戶評論計數。

有沒有說我面臨着不把太多的負擔在服務器上的問題,更好的辦法?

+1

由於這些表中有很多記錄,是否會在服務器上施加很多負載?你有索引設置爲該查詢?這似乎是一個合理的查詢。 – 2013-02-19 02:05:51

+0

現在,它不會承受太多的負載,因爲該應用程序沒有生效。我只是想着如果你有100個或更多的類別和幾十萬個用戶,看起來是什麼樣子。 – yellowreign 2013-02-19 02:28:12

回答

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 

我不認爲你運行該查詢是但你永遠不知道,直到你打擊生產和規模相當,它會有什麼影響。