Rails Active Record,相互依赖地狱

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

我有两个具有 1 对 1 相互依赖关系的模型。

用户 (1..1) <-> (1..1) 地址

我是这样设置的:

class User
  has_one :address
  validates :address, presence: true

  # automatic create address object for new Users.
  before_validation :create_address, on: :create

  def create_address
    if !address.present?
      build_address
    end
  end
end

class Address
  belongs_to :user
  validates :user, presence: true
end

我也有这些工厂(FactoryBot)

factory :user do
end


factory :address do
  association :user
end

但这会产生无限的问题。

当我尝试使用

Address
创建
FactoryBot.create(:address)
时,它会为同一用户创建 2 个地址。

我找到的唯一解决方案是要么删除User类中Address的自动创建,要么删除Address工厂中User的自动创建。

无论如何,如果我不特意添加缺少的依赖项,工厂将是不完整的并且会失败。

我也可以删除验证,但这对我来说听起来更丑陋。

我尝试过和

FactoryBot callbacks
一起玩。但是,在没有保存其他实例的情况下,不可能保存任何实例,并且在没有其他实例的情况下,任何一个实例都无法保存:/

您对此有何看法?

ruby-on-rails rails-activerecord
1个回答
0
投票

我使用这个工厂找到了一个稳定的解决方案:

factory :address do
  before(:create) do |address|
    if address.user.nil?
      create(:user, address: address)
    end
  end
end

这样我在工厂中创建了用户,但同时将正在创建的地址关联到它

© www.soinside.com 2019 - 2024. All rights reserved.