如何在加载灯具之后、创建保存点之前执行 SQL 语句?

发布于 2024-10-12 21:03:41 字数 319 浏览 3 评论 0原文

我们有一个模型,它使用另一个模型的表上的 auto_increment 从另一个模型的 ID 中获取序列号。每当数据库服务器重新启动时,该值就会设置为零,因此序列号会重置。为了解决这个问题,在 after_initialize 块中,我们将 auto_increment 值设置为最大序列值加一,一切都很好。

然而,在测试中,块在加载装置之前运行,因此最大值返回为零。然后,当测试运行时,该值太低,因此测试失败。

一种可能的解决方案是更新设置块中的值,但更改表会提交当前事务,因此测试结束时的回滚会失败。

如何在加载灯具后、创建保存点之前更改 AUTO_INCRMENT 值?

We have a model which gets a sequence number from the ID of another model, using auto_increment on the other model's table. That value gets set to zero whenever the db server is restarted, so the sequence numbers reset. To work around this, in an after_initialize block, we set the auto_increment value to the maximum sequence value plus one, and all is well.

However, in the tests, the block runs before fixtures are loaded, so the maximum comes back as nil. Then when the tests run, the value is too low and so the tests fail.

One possible solution is to update the value in a setup block, but altering the table commits the current transaction and so the rollback at the end of the test fails.

How do I alter the AUTO_INCREMENT value after fixtures are loaded, but before the savepoint is created?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原野 2024-10-19 21:03:41

最终找到了一种方法,通过在 test_helper.rb 末尾修补 load_fixtures 来实现此目的:

module ActiveRecord
  module TestFixtures
    def load_fixtures_with_auto_increment_reset
      load_fixtures_without_auto_increment_reset
      # code to reset auto_increment goes here
    end

    alias_method :load_fixtures_without_auto_increment_reset, :load_fixtures
    alias_method :load_fixtures, :load_fixtures_with_auto_increment_reset
  end
end

Finally found a way to do this by monkey patching load_fixtures at the end of test_helper.rb:

module ActiveRecord
  module TestFixtures
    def load_fixtures_with_auto_increment_reset
      load_fixtures_without_auto_increment_reset
      # code to reset auto_increment goes here
    end

    alias_method :load_fixtures_without_auto_increment_reset, :load_fixtures
    alias_method :load_fixtures, :load_fixtures_with_auto_increment_reset
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文