创建具有has_many关系的父子工厂

时间:2019-06-14 16:46:09

标签: ruby-on-rails ruby

我有医院和患者模型。医院与病人有很多关系。我在医院模型validates :patients, :presence => true中进行了验证检查。添加此验证检查后,用于控制器的rspec失败,这只是在创建医院对象。我试图建立一家可以制造医院和病人的工厂,但到目前为止还没有运气。这是我到目前为止尝试过的。

FactoryBot.define do
  factory :hospital do
    hospital_id { Faker::Crypto.unique.md5 }
    name { 'something' }
    departments { 'some description' }

    after(:create) do |hospital|
      create(:patient, patient_id: hospital.id)
    end
  end
end

知道我在做什么错吗?

3 个答案:

答案 0 :(得分:0)

factory :hospital do
  after :create do |hospital|
    create :hospital, patient: patient
  end
end

这是一个不错的备忘单:https://devhints.io/factory_bot

答案 1 :(得分:0)

就像我在评论中说的那样,这种验证可能不会很有帮助。但是我认为他们唯一的方法就是在一次save通话中节省医院和患者。因此,您可能需要在保存医院之前将未保存的患者加入医院协会。 Rails将自动保存未保存的关联。

尝试一下:

FactoryBot.define do
  factory :hospital do
    hospital_id { Faker::Crypto.unique.md5 }
    name { 'something' }
    departments { 'some description' }

    before(:create) do |hospital|
      build(:patient, hospital: hospital)
    end
  end
end

答案 2 :(得分:0)

我以前做过这样的事情;不再记得了,但是您可以尝试以下吗?

FactoryBot.define do
  factory :hospital do
    # ...

    after(:build) do |hospital|
      hospital.patients << build(:patient, hospital: hospital)
      # I think this needs to be assigned directly to the `hospital` object itself so that it shares the same memory space
      # when `save` is called on `hospital`, the `.patients` also get `save`d
    end
  end
end

如果上述方法不起作用,您可以试试吗?

FactoryBot.define do
  factory :hospital do
    # ...

    after(:build) do |hospital|
      hospital.patients.build(
        attributes_for(:patient, hospital: hospital)
      )
    end
  end
end