Ruby on rails Rails更新对象创建两个数据库事务
我有一个通过表单向导更新的模型。在最后一步中,我想用表单数据更新对象,然后调用模型中的回调函数将数据推送到外部API。我遇到的问题是,最后一步是在两个事务中保存数据Ruby on rails Rails更新对象创建两个数据库事务,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个通过表单向导更新的模型。在最后一步中,我想用表单数据更新对象,然后调用模型中的回调函数将数据推送到外部API。我遇到的问题是,最后一步是在两个事务中保存数据 # controller def update @business = current_user @loanapplication = @business.loan_applications.last @loanapplication.update_attributes(loan_application_params(s
# 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
这两次提交使我的模型中的回调触发两次,如果我能想出如何保存和更新模型中的数据一次,那么我的回调将只触发一次。有什么方法可以找出导致这两次提交的原因吗?调用了两次
:create\u salesforce\u loan\u应用程序
,因为对象在此过程中被更新了两次,可能是通过其他回调或gem(如曲别针)进行的
更好的方法是在保存后使用,而不是在提交后使用,检查: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
class-LoanApplication
您使用哪个版本的rails?我发现:报告您的问题。@RiccardoDegan我使用的是rails 4.1.0:create\u salesforce\u loan\u应用程序被调用了两次,因为在这个过程中对象被更新了两次。您能否验证没有其他回调导致对象更新两次?也许回形针
是在将文件保存到AWS后做的?@dgilperez我想它也与回形针有关。今晚我会做一些调查,如果我发现了什么,就发回来。谢谢!这起作用了。你能详细说明为什么状态改变在这种情况下起作用吗?看看方法和步骤。在事务中,对象知道某个属性是否已更改。这种情况发生在保存之后、创建之后、更新之前。。。但不是在提交后的,它是在事务提交后激发的,因此对象属性在该点不再更改。