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

标签 ruby-on-rails database rspec

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

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/

相关文章:

ruby-on-rails - 当部署用户与运行用户不同时处理 Ruby on Rails 项目中的 shared/tmp

c# - 找不到查询 'Select' 的实现未找到

php - 如何将一个MySql数据库和用户添加到另一个表和用户?

ruby-on-rails - 如何期待 'render template' 错误

ruby - Capybara + RSpec, spec/features 目录被 rspec 忽略。命令?

ruby - Watir 检查文本是否存在

ruby-on-rails - 在 nil 对象上使用 strftime - 如何防止错误?

jquery - 由于 Heroku 上的 MIME 类型不匹配,脚本被阻止

javascript - 使用 Bootstrap 和使用选项卡时不绘制迷你图

database - 从 Oracle 同步数据到 PostgreSQL