2014-09-25 46 views
1

我需要創建一個用戶,並在註冊時發送電子郵件:after_commit或after_create用於使用交易的模型?

class User < ActiveRecord::Base 

    after_commit :send_email, on: :create # I believe it's better than after_create 
    # after_create :send_email, on: :create 

    class << self 
    def create_with_some_params(params) 
     #.... 
     user.transaction do 
     if user.save && some_condition 
      user.category = category 
      raise ActiveRecord::Rollback unless user.category.persisted? 
     end 
     end 

     rescue => e 
     logger.error e.message 
     ensure 
     [user, some_data] 
     end 
    end 
    end 

    send_email(....) 
     #..... 
    end 
end 

起初我用after_create發送一封電子郵件,正在交易中進行發送電子郵件。而且經常發生超時。所以我開始使用after_commit,因爲它在事務之後被稱爲,因此由於電子郵件緩慢而不會發生超時。

因此,在這種情況下與user.transaction do,我應該使用after_commit而不是after_create來避免事務超時?

回答

1

在這些情況下,我更喜歡after_commit,因爲它確保整個事務在「行爲」之前完成並提交給數據庫。

不過,有一件事情可以幫助解決電子郵件緩慢的問題,即增加類似SidekiqDelayedJob(後臺處理)以提高應用程序性能,特別是Rails出名的緩慢郵件程序。

我們一直在使用Sidekiq工作了幾年,這是天賜良機,因爲我們的應用程序是內容傳送系統!

MyMailer.delay.send_some_email(stuff) # this is how we can asynchronously send an email with Sidekiq 

使用背景處理器將消除交易超時,你應該是(一)要堅持after_create或(b)只是想加快郵件程序:)!