2014-02-08 75 views
0

我有一個活動流,顯示用戶的活動,想象一個用戶更新他的頭像,然後1000人喜歡這個活動,結果是1活動,顯示用戶更新他的頭像,以及1000這樣的其他活動:person_1 likes photo of user x, person_2 likes photo of user x ..... person_1000 likes photo of user x我應該移動在後臺進程中銷燬大量記錄嗎?

如果用戶再次更新其頭像,第一個頭像將被新頭像取代,所有1000個「喜歡」活動應該被銷燬,因爲第一個頭像不再存在,所以我有一個叫做update_avatar的方法:

def update_avatar 
    if @user.update(avatar_param) 
     # ---------- destroy old activities ----------------- 
     # destroy the 1000 likes 
     # destroy the initial activity : user added a new avatar 
     # -------------------------------------------------------- 
     # create new activity for the new avatar 
     .... 
    end 
end 

這裏當用戶更新他的頭像時,我銷燬了所有與舊頭像相關的舊活動,如果t他的這些活動數量很高(在這個例子中是1000,可以更多),我認爲這需要一些時間來摧毀所有這些活動!我應該在後臺進程中運行代碼的一部分「銷燬舊活動」嗎?

感謝您的幫助

回答

1

通常應該在單獨的後臺作業流程中運行任何緩慢的流程 - 並且大量的數據庫活動當然都有資格。

如果您發現您希望爲在大型工作之前或之後運行的任務添加掛鉤,則還可以在稍後插入其他操作。

批處理你的數據庫活動的性能,你絕對是在正確的方向。

Id使用觀察者模式調用schedule_for_destruction作業,然後將相應的信息發送到作業隊列。

+0

嗨@RichardJordan,謝謝你的回答,你的意思是說我的數據庫活動也是爲了性能而批量生產的? – medBo

+0

我的意思是發送一條指令刪除所有的數據,而不是迭代一個對象數組,每次調用一次刪除,導致數據庫多次往返。 –

+0

是的,我使用的地方+ destroy_all但我認爲這也應該在後臺進程中運行我是正確的? – medBo

1

簡短的回答是:是的。不過,我認爲這實際上指向了程序本身的設計缺陷。

或許不是爲每個活動存儲用戶頭像,也許只是將指針(外鍵)存儲到它引用的用戶對象。這樣,每當頭像得到更新,它就會自動拉新頭像。

從本質上講,這樣,你永遠也不會摧毀1000X對象,因爲它們都仍然有效(即該仍將指向這將有正確的畫面相同的用戶對象)

+0

我不存儲每個活動的頭像,在每個活動中我存儲user_id,那麼如果用戶更改他的頭像,所有活動仍然使用新頭像指向同一用戶,但邏輯上我認爲如果你喜歡舊的頭像這並不意味着你想喜歡新的 – medBo

+0

我看,在這種情況下...也許它應該在一個工人完成,我可能會做一個sidekiq(或其他後臺處理器)工人https:///github.com/mperham/sidekiq – derekyau

相關問題