学习如何在数据库中创建外键,我有这两个模型:
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/