Подтвердить что ты не робот

FactoryGirl has_many соединение с проверкой

У меня стандартная связь has_many (у Резервирования много заказов) с подтверждением того, что Бронирование не сохраняется без хотя бы одного ордера. Я пытаюсь воспроизвести это с завода FactoryGirl, но проверка не позволяет мне это сделать.

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

class Order < ActiveRecord::Base
  belongs_to :booking
end

Вот мои спецификации FactoyGirl factory для каждой модели, как следует из вики-страницы FactoryGirl GitHub.

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 к вашим заводам, но я хотел бы решить это в любом случае, если есть хороший способ сделать это.

Спасибо заранее.

4b9b3361

Ответ 1

Wat? Невозможно? Совсем нет.

Просто измените код на что-то вроде этого:

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

Ответ 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

Ответ 3

Это похоже на чрезмерно упрощенное наблюдение, но то, что вы пытаетесь сделать, действительно, убедитесь, что Order существует до Booking, что невозможно, поскольку Order не может существовать без его booking_id (что означает, что сначала нужно создать Booking).

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

Даже печально известный accepts_nested_attributes_for не поможет вам здесь.

Мой совет - переосмыслить стратегию сохранения и проверки записей, чтобы она стала более разумной.