如何使用factory_girl创建相互验证的记录

时间:2012-03-18 12:39:50

标签: ruby-on-rails factory-bot

这是我的模特:

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

我想解决这些错误。 我尝试了几件事,但我无法解决它们。 在这种情况下,我怎样才能创建父母和子工厂?

你有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

问题出在您的工厂:

我在上面的代码中,我创建了一个父项,它将创建一个再次创建父对象的子项。这会递归地发生,因为你得到“Stack?Level Too Deep”错误。 同样适合孩子。

也许你应该尝试这个

工厂:父母做| p |

p.sequence(:name){| n | “John#{n}”}

工厂:孩子做| c |

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

结束