ActiveRecord事务中的错误处理?

Kev*_*vin 38 activerecord ruby-on-rails

我需要在故障单和用户表中创建一行...我只需要知道如何处理以防事务失败.

@ticket.transaction do
    @ticket.save!
    @user.save!
end
    #if (transaction succeeded)
        #.....
    #else (transaction failed)
        #......
    #end
Run Code Online (Sandbox Code Playgroud)

另外,我要感谢所有参与堆栈溢出的人,帮助设计师学习更多编程......我感谢你们抽出时间回答n00b这样的问题:)

Mat*_*ght 57

如果您正在使用保存!带有爆炸(感叹号)的方法,当保存失败时,应用程序将抛出异​​常.然后,您必须捕获异常以处理故障.

begin
  @ticket.transaction do
    @ticket.save!
    @user.save!
  end
  #handle success here
rescue ActiveRecord::RecordInvalid => invalid
   #handle failure here
end
Run Code Online (Sandbox Code Playgroud)

  • @MattMcKnight Ando有一点意见.您的第一个代码段不正确,因为Rails不会回滚对数据库的更改.仅当事务中的代码引发异常时才会启动回滚.返回false将不会回滚数据库.因此,交易中的`@ record.save`是完全错误的. (21认同)
  • 像第一个代码段中的事务(没有抛出异常)的事务根本不是Rails事务.像第二个代码段中的那个事务应该抢救所有异常(rescue => e),处理失败,并可能再次引发相同的异常. (7认同)
  • 对不起Ando,但它显然是一个ActiveRecord事务,由"事务"方法证明.事务的重点是如果第二个操作(保存票证)失败则回滚第一个操作(保存票证).对于新开发人员来说,这是一个非常基本的例子......显然,人们会用失败处理来代替注释.感谢您分享您对错误处理的看法,但该示例来自Rails的初始作者所写的"使用Rails进行敏捷Web开发".因此,我会对你没有抛出异常的东西进行描述,因为不是Rails (7认同)
  • 这里要添加的一件事是,您可以在事务中引发 `ActiveRecord::Rollback` 以强制回滚。Railse 不会重新引发此异常。 (2认同)