Я внедряю систему ваучеров / купонов, где пользователь может купить один или несколько ваучеров для данного продукта. Например, пользователь может купить два ваучера для покупки безалкогольного напитка со скидкой в магазине 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
ОБНОВЛЕНИЕ:
Я использую полосу для обработки платежа, поэтомуВ модели заказа есть идентификатор_так. Для хранения токена полосы - надеюсь, это поможет.