FactoryGirl与validation有很多联系

我有一个标准的has_many关系(预订有很多订单),validation如果没有至少一个订单就不会保存预订。 我试图用FactoryGirl工厂复制这个,但validation阻止我这样做。

 class Booking < ActiveRecord::Base has_many :orders validates :orders, presence: true end class Order < ActiveRecord::Base belongs_to :booking end 

以下是FactoryGirl的GitHub维基页面中每个型号的FactoyGirl工厂规格。

 FactoryGirl.define do factory :booking do factory :booking_with_orders do ignore do orders_count 1 end before(:create) do |booking, evaluator| FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking) end end end factory :order do booking end end 

当我尝试从我的规范运行FactoryGirl.create(:booking_with_orders) ,我得到:

 Failure/Error: @booking = FactoryGirl.create(:booking_with_orders) ActiveRecord::RecordInvalid: Validation failed: Orders can't be blank 

看起来validation检查甚至在before(:create) [...] ,理论上会创建预订订单。

这篇文章建议不要将has_many关系添加到你的工厂,但如果有一个很好的方法,我想解决这个问题。

提前致谢。

笏? 不可能? 一点也不。

只需将您的代码更改为以下内容:

 after :build do |booking, evaluator| booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil) end 

从@ jassa的答案起飞,如果你只需要添加一个具有特定属性的单个(必需)关联记录,这个模式对我有用:

 factory :booking do ignore do order_name "name" end after :build do |factory, evaluator| factory.orders << FactoryGirl.build(:order, name: evaluator.order_name, booking: nil) end end 

这似乎是一个过于简单化的观察,但你想要做的是确保OrderBooking之前存在,这是不可能的,因为Order在没有booking_id情况下不能存在(意味着需要首先创建Booking )。

在您的工厂中,has_many关系没有任何问题,这是您的validation,这是一个问题。 这目前适用于您的应用程序吗? 在这种情况下,你如何保存你的记录? 创建订单和预订的流程是什么?

即使臭名昭着的accepts_nested_attributes_for也不会帮助你。

我的建议是重新考虑您的记录保存和validation策略,以便更加理智。