ruby-on-rails Rails活动记录,相互依赖地狱

vof42yt1  于 5个月前  发布在  Ruby
关注(0)|答案(2)|浏览(64)

我有两个模型,它们具有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


但这会产生无限的问题。
当我尝试使用FactoryBot.create(:address)创建一个Address时,它为同一个用户创建了2个线程。
我找到的唯一解决方案是删除User类中Address的自动创建,或者删除Address工厂中User的自动创建。
在任何情况下,工厂都将是不完整的,如果我不添加缺少的依赖项,工厂将失败。
我也可以删除验证,但这听起来更丑陋的我。
我尝试了很多组合。但是不可能保存其中一个示例而另一个示例没有被保存,没有另一个示例它们都不能被保存:/
你对此有什么看法?

1bqhqjot

1bqhqjot1#

您可以使用内联关联定义并使用引用正在创建的模型的instance方法:

factory :user

factory :address do
  user { association :user, address: instance }
end

个字符

  • 网址:http://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#interconnected-associations*
class Address
  belongs_to :user
  # ^ belongs to is already required. extra validation is redundant.
  validates :user, presence: true
end
>> Address.validators
=>
# validation from belongs to  vvv
[#<ActiveRecord::Validations::PresenceValidator:0x00007fb9d6853878 @attributes=[:user], @options={:message=>:required}>,
 #<ActiveRecord::Validations::PresenceValidator:0x00007fb9d687b238 @attributes=[:user], @options={}>]
# your presence validation    ^^^

的字符串

tcomlyy6

tcomlyy62#

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

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

字符串
这样,我在工厂中创建了User,但同时将正在创建的Address与之关联

相关问题