Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails更新对象创建两个数据库事务_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails Rails更新对象创建两个数据库事务

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

我有一个通过表单向导更新的模型。在最后一步中,我想用表单数据更新对象,然后调用模型中的回调函数将数据推送到外部API。我遇到的问题是,最后一步是在两个事务中保存数据

# 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我想它也与回形针有关。今晚我会做一些调查,如果我发现了什么,就发回来。谢谢!这起作用了。你能详细说明为什么状态改变在这种情况下起作用吗?看看方法和步骤。在事务中,对象知道某个属性是否已更改。这种情况发生在保存之后、创建之后、更新之前。。。但不是在提交后的
,它是在事务提交后激发的,因此对象属性在该点不再更改。