2015-02-09 50 views
1

我有一個模型,我通過表單嚮導進行更新。在最後一步中,我想用表單數據更新對象,然後在模型中調用回調函數將數據推送到外部API。我遇到的問題是finall步驟將數據保存在兩個事務中。Rails更新對象創建兩個數據庫事務

# controller 
def update 
    @business = current_user 
    @loanapplication = @business.loan_applications.last 
    @loanapplication.update_attributes(loan_application_params(step)) 
    params[:loan_application][:status] = 'active' if step == steps.last 
    render_wizard @loanapplication 
end 

# Model 
# Callbacks 
after_commit :create_salesforce_loan_application, :on => :update 
def create_salesforce_loan_application 
    if self.status == 'active' 
    puts "create salesforce function running"  
    # Updating business column 
    self.business.update_column(:state, 1) 
    end 
end 

數據庫事務

[paperclip] saving XXX.xlsx 
[AWS S3 200 0.101161 0 retries] put_object(:acl=>:public_read,:bucket_name=>"",:content_length=>29467,:content_type=>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",:data=>Paperclip::UploadedFileAdapter: FX - Competitive Analysis.xlsx,:key=>"XX.xlsx") 
(0.4ms) COMMIT 
create salesforce function running 
SQL (1.3ms) UPDATE "users" SET "state" = 1 WHERE "users"."type" IN ('Business') AND "users"."id" = 55 
(0.2ms) BEGIN 
(0.2ms) COMMIT 
create salesforce function running 
SQL (1.3ms) UPDATE "users" SET "state" = 1 WHERE "users"."type" IN ('Business') AND "users"."id" = 55 

兩個提交正在在我的模型火回調兩次,如果我能想出如何保存更新模型中的數據一次,然後我的回調只會觸發一次。有什麼方法可以找出導致兩次提交的原因?

+0

您使用哪個版本的導軌?我發現這個:[link](https://github.com/rails/rails/issues/8937)報告你的問題。 – GeekRiky 2015-02-10 00:13:42

+0

@RiccardoDegan我正在使用rails 4.1.0 – Questifer 2015-02-10 00:15:08

+0

'':create_salesforce_loan_application''被調用兩次,因爲對象在進程中更新兩次。你能否驗證沒有其他回調導致對象更新兩次?也許''paperclip''在將文件保存到AWS後執行此操作? – dgilperez 2015-02-10 00:25:23

回答

0

:create_salesforce_loan_application被調用兩次,因爲對象在進程中更新了兩次,可能是其他回調或像回形針那樣的gem。

更好的方法是使用after_save而不是after_commit,檢查:status屬性是否更改。

class LoanApplication < ActiveRecord:Base 
    after_save :create_salesforce_loan_application, on: :update 

    def create_salesforce_loan_application 
    if status_changed? && status == 'active' 
     puts "create salesforce function running"  
     # Updating business column 
     business.update_column(:state, 1) 
    end 
    end 
end 
+0

謝謝!這工作。你能詳細說明爲什麼status_changed在這種情況下工作嗎? – Questifer 2015-02-10 03:02:47

+0

查看http://api.rubyonrails.org/classes/ActiveModel/Dirty.html方法和http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html。在一個事務中,對象知道某個屬性是否改變。發生'after_save'','after_create'','before_update'' ...,而不是'after_commit',在事務被提交後觸發,所以對象屬性不會在那個時候被改變點。 – dgilperez 2015-02-10 03:05:50