在我的应用程序中。我有模型-订单has_many order_items,发票has_many invoice_items。我正在为order和order_items创建工厂,如下所示:-
订单工厂:-
FactoryGirl.define do
factory :order do
booked_at {Date.current}
approved_at {Date.current}
state "draft"
customer
user
notes "NOTE !!!"
ip_address "127.0.0.1"
approver_id 1
channel "mobile"
transient do
order_items_count { 5 }
end
order_items_attributes do
attributes = []
order_items_count.times do
# We are not using attributes_for(:order_item) below as attributes_for do not generate attributes for association (varint in this case)
attributes << attributes_with_foreign_keys_for(:order_item)
end
attributes
end
after(:build) do |order|
order.customer.reload # Do not remove this, if you remove this customer.default_address and customer.shipping_address etc won`t show up in customer.addresses
order.shipping_address = FactoryGirl.build(:customer_address, customer_id: order.customer_id)
order.billing_address = FactoryGirl.build(:customer_address, customer_id: order.customer_id)
end
end
end
OrderItem工厂:-
FactoryGirl.define do
factory :order_item do
association :variant, factory: :product
booked_quantity 10
price 50
end
end
现在,当我创建发票和发票项目工厂时,我遇到了一个问题,即发票项目取决于订单项目。就像创建第一个订单一样,只有然后才能创建发票。
发票工厂:-
FactoryGirl.define do
factory :invoice do
date "2018-03-05"
due_date "2018-03-05"
user
invoice_term
transient do
invoice_items_count { 5 }
end
invoice_items_attributes do
attributes = []
invoice_items_count.times do
# We are not using attributes_for(:invoice_item) below as attributes_for do not generate attributes for association (varint in this case)
attributes << attributes_with_foreign_keys_for(:invoice_item)
end
attributes
end
after(:build) do |invoice|
@order = create(:order, state: "confirm")
@customer_id = @order.customer_id
invoice.customer_id = @customer_id
end
end
end
发票项目工厂:-
FactoryGirl.define do
factory :invoice_item do
variant_id 1
order_item_id 1
quantity "9.99"
price "9.99"
item_total "9.99"
discount_total "9.99"
tax_total "9.99"
tax_category_id 1
end
end
现在,在我的发票项目工厂中,我将variant_id 1,order_item_id 1放入其中,它应该来自已创建的order_item(而不是每个invoice_item为1)。我怎样才能做到这一点?