Spree::OrderPopulator.populate упорядочивает два элемента по одному

У меня есть программа, в которой я пытаюсь программно создавать заказы Spree. Я использую класс OrderPopulator, чтобы завершить это. Мой код:

populator = Spree::OrderPopulator.new current_order(create_order_if_necessary: true), current_currency
products.each do |product|
  variant = Spree::Variant.find_by product_id: product.id, is_master: true
  puts "Pre-Items: #{current_order.line_items.count}"
  populator.populate({ products: { product_id: product.id, variant_id: variant.id }, quantity: 1 })
  puts "Post-Items: #{current_order.line_items.count}"
  puts "Products: #{current_order.line_items.first.quantity}"
end

Это печатает:

Pre-Items: 0
Post-Items: 1
Products: 2

Products должно быть 1, потому что это количество я указал при добавлении элемента. Что я делаю неправильно?

1 ответ

Решение

Вы немного путаете продукты и варианты. В Spree 2.1 у нас есть немного кода:

https://github.com/spree/spree/blob/v2.1.6/core/app/models/spree/order_populator.rb#L21-L27

Позволяет добавить товар и / или вариант. Поскольку вы указали два идентификатора в хэше продуктов, он попытается добавить первый (product.id) и второй (option.id).

Я полагаю, что ваше количество равно 2, потому что ваш product.id == option.id.

Я бы рекомендовал добавлять вещи только по идентификатору варианта, поэтому попробуйте:

populator.populate({ variants: { variant_id: variant.id }, quantity: 1 })

Spree 2.2.x покончил с некоторыми из этих сложностей и теперь заполнение просто принимает вариант id:

https://github.com/spree/spree/blob/v2.2.1/core/app/models/spree/order_populator.rb#L13-L16

Другие вопросы по тегам