为什么ActiveRecord在引发StatementInvalid错误后返回一个空数组?

时间:2015-07-09 20:19:19

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

specify 'Test' do
  Foo.create

  expect( Foo.count ).to eq 1

  expect{ ActiveRecord::Base.connection.execute( 'invalid sql' )}
    .to raise_error ActiveRecord::StatementInvalid

  ActiveRecord::Base.connection.execute 'ROLLBACK'

  expect( Foo.count ).to eq 1
end

这会导致以下失败:

Failure/Error: expect( Foo.count ).to eq 1

   expected: 1
        got: 0

引发StatementInvalid错误后,App.all返回一个空数组。因此,似乎错误已经毒害了未来的AR DB呼叫。

这个错误来自哪里?有没有办法重置AR连接来解决这个问题?

ActiveRecord 4.1.7和PostgreSQL。

1 个答案:

答案 0 :(得分:1)

通常,保存过程包含在事务中,最外面的保存(如果保存回调,关联等执行更多数据库更新)在提交时提交事务。

在测试中,通常不会发生这种情况:事务用于防止单个测试更改数据库(rails内置了对此的支持,而且database_cleaner gem也很受欢迎)。您的手册'回滚'声明因此回滚你的创建电话。