Создать родительскую и дочернюю фабрику, имеющую отношение has_many - PullRequest
0 голосов
/ 14 июня 2019

У меня есть больница и модель пациента. Больница имеет множество отношений с пациентами. У меня есть проверка в больнице модели validates :patients, :presence => true. После добавления этой проверки правильности сбой rspecs для контроллеров, которые просто создают объект больницы. Я пытался создать фабрику, которая будет создавать больницы и пациентов, но пока не повезло. Это то, что я пробовал до сих пор.

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 голосов
/ 14 июня 2019

Как я уже сказал в комментарии, эта проверка, вероятно, не будет очень полезна. Но я думаю, что единственный способ сделать это - спасти больницу и пациентов за один 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
0 голосов
/ 14 июня 2019

Я делал что-то подобное раньше;не могу вспомнить, но вы можете попробовать следующее?

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
0 голосов
/ 14 июня 2019
factory :hospital do
  after :create do |hospital|
    create :hospital, patient: patient
  end
end

Вот хороший шпаргалка: https://devhints.io/factory_bot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...