【问题标题】:Error Handling in ActiveRecord Transactions?ActiveRecord 事务中的错误处理?
【发布时间】:2009-12-21 01:49:30
【问题描述】:

我需要在tickets 和users 表中创建一行...我只需要知道如何处理以防事务失败。

@ticket.transaction do
    @ticket.save!
    @user.save!
end
    #if (transaction succeeded)
        #.....
    #else (transaction failed)
        #......
    #end

在旁注中,我只想感谢所有参与堆栈溢出的人帮助设计师学习更多编程......我很感激你们抽出时间来回答这样的 n00b 问题 :)

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    如果您正在使用保存!方法带有 bang(感叹号),当保存失败时应用程序将抛出异​​常。然后你必须捕获异常来处理失败。

    begin
      @ticket.transaction do
        @ticket.save!
        @user.save!
      end
      #handle success here
    rescue ActiveRecord::RecordInvalid => invalid
       #handle failure here
    end
    

    【讨论】:

    • 非常感谢马特,我很感激 :)
    • 第一个 sn-p 中的事务(不抛出异常)根本不是 Rails 事务。像第二个 sn-p 中的事务应该拯救所有异常(rescue => e),处理失败,并可能再次引发相同的异常。
    • 对不起安藤,但它显然是一个 ActiveRecord 事务,如“事务”方法所证明的那样。事务的重点是,如果第二个操作(保存票证)失败,则将回滚第一个操作(保存票证)。对于新开发人员来说,这是一个非常基本的示例……显然,有人会将注释替换为故障处理。感谢您分享您对错误处理的看法,但示例来自 Rails 的最初作者所写的“Agile Web Development with Rails”!所以我会反对你对不抛出异常的东西的描述,因为它不是 Rails
    • @MattMcKnight Ando 有道理。您的第一个 sn-p 不正确,因为 Rails 不会回滚对数据库的更改。仅当事务中的代码引发异常时才会启动回滚。返回 false 不会回滚数据库。所以@record.save 在交易中是完全错误的。
    • 这里要添加的一点是,您可以在事务中提高ActiveRecord::Rollback 以强制回滚。 Railse 不会重新引发此异常。
    【解决方案2】:

    我也是初学者,不过我相信大家可以查看@ticket.errors 和@user.errors 并根据他们的回复进行验证

    save 方法也应该返回一个布尔值,用于确定保存是否成功

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多