【问题标题】:ActiveRecord transactions not raising errorsActiveRecord 事务不会引发错误
【发布时间】:2016-05-11 16:00:14
【问题描述】:

我已经设置了一个 ActiveRecord 事务,但是当第二个语句失败时,它不会导致事务失败。这是我的代码:

  Contact.transaction do
    contact = Contact.create(params)
    channel = ContactChannel.create(contact: contact, phone: contact.phone)
    # ContactChannel query raises a validation error
    # puts "ERRORS: #{channel.errors.messages}" outputs the following:
    #      {:channel_key=>["has already been taken"]}
    contact # Still returns the contact that was created
  end

知道为什么尽管出现验证错误但它不会失败吗?

【问题讨论】:

    标签: ruby-on-rails activerecord rails-activerecord rails-api


    【解决方案1】:

    create! 而不是create 应该引发异常,这应该会导致事务回滚。基本上是一个更严格的版本,如果没有引发异常,事务不会失败。

    要获取事务回滚的原因,您可以将事务语句包装在 begin (...) rescue - 块中并捕获 ActiveRecord::Rollback- 错误并使用其消息返回事务失败的原因。

    【讨论】:

    • 哦,有趣!有没有办法在该语句中返回错误消息?
    • 我确实这么认为,您可以使用begin (...) rescue -block 或使用after_rollback-callback。你可能需要尝试一下,我还没来得及玩这个。也许社区可以告诉你更多关于这方面的信息。
    • 哦,显然 ActiveRecord 在回滚事务后重新引发了异常,我将编辑我的答案以包含它。
    • 好吧,我最终在控制器中使用了这段代码,因为这看起来不太好:gist.github.com/biznickman/efe463236a3dfd33ed0dbd1459e0cd9e
    • 我认为这实际上相当不错,没有什么可添加的:-)
    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多