Ответ 1
Wat? Невозможно? Совсем нет.
Просто измените код на что-то вроде этого:
after :build do |booking, evaluator|
booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil)
end
У меня стандартная связь 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
к вашим заводам, но я хотел бы решить это в любом случае, если есть хороший способ сделать это.
Спасибо заранее.
Wat? Невозможно? Совсем нет.
Просто измените код на что-то вроде этого:
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
Это похоже на чрезмерно упрощенное наблюдение, но то, что вы пытаетесь сделать, действительно, убедитесь, что Order
существует до Booking
, что невозможно, поскольку Order
не может существовать без его booking_id
(что означает, что сначала нужно создать Booking
).
Нет ничего плохого в отношениях has_many на ваших фабриках, это ваша проверка, которая является проблемой. В настоящее время это работает в вашем приложении? Как сохранить ваши записи в этом случае? Каков поток для создания заказов и заказов?
Даже печально известный accepts_nested_attributes_for
не поможет вам здесь.
Мой совет - переосмыслить стратегию сохранения и проверки записей, чтобы она стала более разумной.