как дублировать записи по количеству - PullRequest
1 голос
/ 08 октября 2019

Я внедряю систему ваучеров / купонов, где пользователь может купить один или несколько ваучеров для данного продукта. Например, пользователь может купить два ваучера для покупки безалкогольного напитка со скидкой в ​​магазине X. Ваучеры могут быть востребованы одновременно или в 2 разных момента времени, то есть один востребован сегодня, а следующий будет востребован завтра.

При добавлении купонов в корзину покупок формируется Заказ вместе с соответствующим идентификатором order_item для купона + количество.

После успешного завершения оформления заказа мне нужно продублировать купоны, где указано quantity > 1, так как мне нужна отметка времени требуемого времени. для каждого купона в целях аудита.

Другими словами, мне необходимо обновить OrderItem с:

id,quantity,order_id,product_id,claimed_on
1, 2, 001, 010, nil
2, 3, 001, 020, nil

в корзине для покупок до

id,quantity,order_id,product_id,claimed_on
1, 1, 001, 010, nil
2, 1, 001, 020, nil
3, 1, 001, 010, nil
4, 1, 001, 020, nil
5, 1, 001, 020, nil

после покупкипрошло успешно.

Пока что я нашел этот ответ , но я изо всех сил пытаюсь увидеть реализацию с точки зрения activerecord. Моя главная проблема заключается в том, чтобы сгенерировать любой вид блокировки или повреждения таблицы, когда платформу используют несколько пользователей.

Я решил создать третью таблицу, которая будет содержать только успешные заказы, но не кажется хорошей практикой.

Вот мои модели:

class Order < ApplicationRecord
  belongs_to :user
  has_many :order_items
end

OrderItem выглядит следующим образом:

#  id         :bigint(8)        not null, primary key
#  quantity   :integer          default(0), not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  order_id   :bigint(8)
#  product_id :bigint(8)
#
# Indexes
#
#  index_order_items_on_order_id    (order_id)
#  index_order_items_on_product_id  (product_id)
#
# Foreign Keys
#
#  fk_rails_...  (order_id => orders.id)
#  fk_rails_...  (product_id => products.id)
#

class OrderItem < ApplicationRecord
  belongs_to :order
  belongs_to :product
  validates :quantity, numericality: { greater_than_or_equal_to: 0 }

  after_save :destroy_if_zero

  def total
    quantity * product.active_product_prices.price
  end

  private
    def destroy_if_zero
      destroy if quantity.zero?

    end


end

ОБНОВЛЕНИЕ:

Я использую полосу для обработки платежа, поэтомуВ модели заказа есть идентификатор_так. Для хранения токена полосы - надеюсь, это поможет.

1 Ответ

1 голос
/ 08 октября 2019

Я бы не использовал одну и ту же таблицу для заказов и купонов / ваучеров. Если бы я был на вашем месте, я бы удалил поле требуемый_он в таблице order_item и создал бы дочернюю таблицу

VoucherCoupon
    id
    order_item
    claimed_on
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...