Как создавать записи, которые проверяют друг друга с factory_girl - PullRequest
0 голосов
/ 18 марта 2012

Вот мои модели:

class Parent < ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children
  validate :parent_must_have_child_status_1
  def parent_must_have_child_status_1
    errors.add(:base, :no_child_status_1) if children.all? {|c| c.status != 1}
  end
end

class Child < ActiveRecord::Base
  belongs_to :parent
  accepts_nested_attributes_for :parent
  validates :parent, :presence => true
end

и мои заводы:

factory :parent do
  children { [FactoryGirl.build(:child, :status=>1)] }
end
factory :child  do
  parent
end

и результат FactoryGirl.create

FactoryGirl.create(:parent) #=> SystemStackError: stack level too deep
FactoryGirl.create(:child) #=> SystemStackError: stack level too deep

Я хочу решить эти ошибки. Я попробовал несколько вещей, но я не мог их решить. Как я могу создать родительскую и дочернюю фабрику в этой ситуации?

У вас есть идея?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 декабря 2012

Я использую, чтобы сделать что-то вроде этого:

factory :parent do
  after(:create) do |parent|
    parent.children << FactoryGirl.create(:child, :status=>1)
  end
end

Это работает очень хорошо.

0 голосов
/ 07 мая 2012

проблема в ваших фабриках:

Я выше кода, я создаю родительский объект, он создаст дочерний элемент, который снова создаст родительский объект. Это произойдет рекурсивно, что вы получите "Stack? Level Too Deep" ошибка.То же самое и для ребенка.

Возможно, вам следует попробовать это

factory: parent do | p |

p.sequence (: name) {| п |"Джон # {n}"}

end

фабрика: child do | c |

c.parents {| parent |[parent.association (: parent)]}

end

...