使用 Rails 的活动记录,是否有另一种方法可以在不引发异常的情况下进行回滚?

l__*_*__l 5 ruby activerecord ruby-on-rails

我正在编写测试并且对我必须引发异常以获得回滚这一事实感到困扰。

raise ActiveRecord::Rollback
Run Code Online (Sandbox Code Playgroud)

我对此感到困扰的原因是因为我需要回滚以保持我的数据库干净,以便下次测试运行。没有异常事件。

这违背了不应预期的例外的想法。除此之外,例外是昂贵的。

那么,是否有另一种回滚方法,或者我的担忧不合理(如果是,请解释原因)?

我忘了提到我的应用程序是使用 ActiveRecord 和 mini test 的 Sinatra 应用程序。

Bra*_*rth 1

总的来说,我认为你的担忧是合理的。在大多数情况下,例外情况的代价高昂的,并且不应该被期望。

但是,根据ActiveRecord::Rollback 的文档,此异常有些独特。它的目的是“区分故意回滚和其他特殊情况”。

引用文档:

ActiveRecord::Transactions::ClassMethods#transaction 使用此异常来区分故意回滚和其他异常情况。通常,引发异常将导致事务方法回滚数据库事务并传递异常。但是,如果引发 ActiveRecord::Rollback 异常,则数据库事务将回滚,而不传递异常。

如果 Rails 专门以这种方式使用它,那么确实没有理由不将它用于此(或任何其他相关)目的。

话虽如此,正如Sergio 和 Dan 在评论中指出的那样,许多人似乎更喜欢Rails 的事务固定装置数据库清理器等简单的工具来满足您的用例,而不是创建自定义解决方案。