gpt4 book ai didi

ruby-on-rails - 为什么此代码不具有事务性?

转载 作者:行者123 更新时间:2023-12-04 16:43:08 24 4
gpt4 key购买 nike

我想销毁与特定用户有关的所有问题。有些问题虽然受到保护,但可能会防止自身被破坏并引发异常。

我希望下面的代码要么销毁所有问题,要么不销毁任何问题,但事实并非如此——如果在其他问题中有一个 protected 问题,它不会回滚之前的销毁操作——这是为什么?

class User < ActiveRecord::Base
...

Questions.transaction do
# protected questions will raise a runtime exception
Questions.destroy_all(:user_id => self.id)
end
end

最佳答案

Grrr,刚刚意识到我以前遇到过这个问题,然后浪费了很多时间才弄清楚。

问题是测试是在 RSpec 中完成的,它本身使用事务并因此从代码中删除了事务功能(注:任何从 RSpec 团队阅读这篇文章的人——在解析代码时发出警告会很好包含交易 - ty!)。

为了使事务在 RSpec 中工作,将其包装在以下代码中:

describe "the set of cases you want to address" do

# make sure this next line is contained within a describe block or it'll affect everything
self.use_transactional_fixtures = false

after(:each) do
# destroy all objects you created (since RSpec won't roll them back for you)
# use delete rather than destroy to force removal
User.delete_all
Question.delete_all
end

it "should not destroy any questions when one fails to be destroyed" do
# assuming one of the questions throws an error on being destroyed
expect{
@user.destroy
}.to change{ Question.all.count }.by(0)
end
end

结束

关于ruby-on-rails - 为什么此代码不具有事务性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com