gpt4 book ai didi

ruby-on-rails - 为什么要坚持?没有察觉到数据库的变化?在 rails 上

转载 作者:搜寻专家 更新时间:2023-10-30 23:36:41 24 4
gpt4 key购买 nike

学习如何在数据库中创建外键,我有这两个模型:

class Bar < ApplicationRecord
has_many :foos
end
# and
class Foo < ApplicationRecord
belongs_to :bar
end

然后,我创建了以下外键:

add_foreign_key :foos, :bars, on_delete: :cascade

因此,如果我删除一个 bar,它也应该删除引用它的 foos(确实如此)。但我想为它创建一个测试,所以我这样做了:

foo = create(:foo) # a factory that creates a foo with a bar parent
bar = foo.bar
bar.destroy
expect(foo).to_not be_persisted

令人惊讶的是,它并没有起作用。然后代替 expect(foo).to_not be_persisted 我尝试了这个只是为了确定:

expect(Foo.all.size).to eq 0
expect(Foo.count).to eq 0
expect(Foo.all).to_not include foo

成功了!所以我的问题是:为什么 be_persisted? 不起作用?它不应该验证 foo 是否实际保存在数据库中吗?

最佳答案

您需要注意,通过使用 SQL 级联规则,ActiveRecord 不会意识到这一点。

如果您在模型本身中指定了类似的东西

has_many: :foos, dependent: :destroy

而不是使用 SQL FK 级联规则.. 然后 ActiveRecord 会级联删除并意识到它。

在执行 bar.destroy 之后的 rspec 测试中,执行类似 expect(Foo.find(foo.id)).to be_nil 的操作来测试子记录 - 或者 foo.reload 也可能给你一个 nil 对象。

关于ruby-on-rails - 为什么要坚持?没有察觉到数据库的变化?在 rails 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41337538/

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