如何防止ActiveRecord在保存之前在回调中进行关联记录?

问题描述 投票:0回答:1

我有两个型号,

Branch
Organization
。一个组织有很多分支机构。一个分支机构不能没有关联的组织而存在,而一个组织也不能没有至少一个分支机构而存在。在组织模型中,我们有以下内容:

  after_create :create_branch_if_not_exists!
...
  def create_branch_if_not_exists!
    return unless branches.empty?

    branch = Branch.new(attrs: some_attrs)
    branches << branch
  end

事实证明这是测试时的问题,因为在创建分支时,我们实际上创建了两个。使用 FactoryBot:

FactoryBot.define do
  factory :branch do
    organization
    ...
  end
end

# in test
create(:branch) # this creates two branches.

在创建分支之前,我猜组织已经创建了?它的

after_create
方法不知道即将创建的分支,因此它会先创建一个分支。

有很多测试,总是先创建组织会带来很多变化。

有简单的解决方法吗?或者我只是构建了糟糕的代码还是什么?

尝试更改为

after_commit
但还是一样。

ruby-on-rails activerecord rspec associations factory-bot
1个回答
0
投票

听起来代码和测试逻辑是矛盾的。测试应该依赖于代码行为。

当需要创建分支时,实际代码会做什么?可能与测试相同,也会创建一个组织和另一个分支。这是一个有效的场景吗?

无论如何,如果您确定业务逻辑,您可以尝试在测试中跳过

after_create
回调,如此处所述:

Organization.skip_callback(:create, :after, :create_branch_if_not_exists!)

使用完毕后,您可以设置回调:

Organization.set_callback(:create, :after, :create_branch_if_not_exists!)
© www.soinside.com 2019 - 2024. All rights reserved.