Как сделать зависимые фабрики в factorygirl - PullRequest
0 голосов
/ 04 января 2019

В моем приложении.У меня есть модели - заказать 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

Теперь, вмоя фабрика элементов счета, в которую я поместил вариант_идентификатора 1, порядковый_элемент_ид 1, он должен исходить из уже созданного элемента_порядка (а не 1 для каждого элемента-фактуры).Как я могу это сделать?

...