与验证FactoryGirl的has_many协会(FactoryGirl has_many ass

2019-07-05 02:38发布

我有一个标准has_many关系(预订有很多订单)与验证一个预订没有得到挽救,没有至少一个数量级。 我想用我的FactoryGirl工厂复制这一点,但验证阻止我这样做。

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

class Order < ActiveRecord::Base
  belongs_to :booking
end

这里是我的FactoyGirl出厂规格为每个模型从FactoryGirl的GitHub的wiki页面紧随其后。

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

这似乎是在验证检查之前,即使在运行before(:create) [...]这将理论上创建预订的订单。

这篇文章建议不要加入has_many关系到你的工厂,但我想反正解决这个问题,如果有做它的好方法。

提前致谢。

Answer 1:

笏? 不可能? 一点也不。

只需更改您的代码是这样的:

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


Answer 2:

从@ 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


Answer 3:

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

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

就连臭名昭著accepts_nested_attributes_for不会帮助你在这里。

我的建议是重新考虑你的记录保存和验证策略,使其多了几分理智。



文章来源: FactoryGirl has_many association with validation