Как создать родителя с дочерней фабрикой за один шаг, чтобы пройти валидацию

Проекты должны иметь по крайней мере одну задачу, созданную одновременно, чтобы гарантировать, что проверки пройдены. Это фрагмент, который я использую для проверки этого:

class Project < ActiveRecord::Base
  validates :tasks, :length => { :minimum => 1 }
  ...
end

Задача, с которой я столкнулся, - создать правильную фабрику для создания проекта с заданием заранее, используя FactoryGirl. Я использую:

FactoryGirl.define do

  factory :task do
    name "Get this test passing"
    project
  end

  factory :project do
    title "Complete the application"
    factory :project_with_tasks do
      ignore do
        tasks_count 5
      end

      after(:create) do |project, evaluator|
        FactoryGirl.create_list(:task, evaluator.tasks_count, project: project)
      end
    end
  end

end

Теперь проблема в том, что это терпит неудачу, поскольку он фактически создает проект, а затем пытается создать связанную задачу. Ошибка сообщается как:

Failure/Error: project = FactoryGirl.create(:project_with_tasks, tasks_count: 2)
 ActiveRecord::RecordInvalid:
   Validation failed: Projects must have at least one task

Превращая это в before(:create) означает, что проект не доступен для ссылки.

Любая помощь будет принята с благодарностью!

2 ответа

Решение

В итоге я получил его, построив завод следующим образом:

project = FactoryGirl.build(:project)  
project.tasks << FactoryGirl.create(:task)  
project.save

Это добавляет задачу в проект перед сохранением.

Можете ли вы примерить до (:create) "построить" задачу для проекта и после (:create) сохранить их, чтобы обойти ошибку проверки?

например:

  before(:build) do |instance|
    instance.tasks << build(:task, project: instance)
  end
  after(:create) do |instance|
    instance.tasks.each{|t| t.save!}
  end
Другие вопросы по тегам