2011-03-29 32 views
1

我有一個ActiveRecord事務發生在Web服務調用期間。它不需要與調用同步,並且發生此事務時發生延遲,並且用戶看到服務器的響應,因爲ActiveRecord正在忙於創建對象並更新數據庫(同時保留某個鎖定MyISAM表)+運行所有回調等。Ruby on Rails 3:將會話數據的ActiveRecord調用移動到後過濾器或後臺作業?

什麼是一個好的策略來移動此ActiveRecord創建調用,以便它不同步阻止Web服務?我需要從操作中創建的用戶會話傳遞創建調用參數,所以我不確定after_filter是否有意義。我應該使用延遲工作,消息隊列還是after_filter最好的選擇?如果答案是after_filter,我可以傳遞參數嗎?

+0

看看這個鏈接,讓你開始http://stackoverflow.com/questions/124360/what-is-the-best-way-to-run-asynchronous-jobs-in-a-rails-application – Vadim 2011-03-29 19:44:09

回答

2

使用延遲作業。

只需將gem 'delayed_job'添加到您的Gemfile中,然後運行bundle install,rails g delayed_jobrake db:migrate

編寫執行你在後臺想要的東西,你的用戶模型的方法,並告訴它總是在後臺運行

# app/models/user.rb 
def do_complex_stuff(session) 
    ... 
end 
handle_asynchronously :do_complex_stuff 

最後,請從您的控制器方法:

# app/controllers/users_controller.rb 
def create 
    # do some stuff 
    ... 

    # fire off the delayed job 
    current_user.do_complex_stuff(current_session) 

    # do some more stuff 
    ... 
end 

這應該讓你開始。有關更多信息,請參見https://github.com/collectiveidea/delayed_job