ActiveRecord事务不会引发错误

时间:2016-05-11 16:00:15

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

我已经设置了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

知道为什么即使验证错误,这也不会失败?

1 个答案:

答案 0 :(得分:2)

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

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