如何根据数量重复记录

时间:2019-10-08 19:07:54

标签: ruby-on-rails ruby postgresql ruby-on-rails-5

我正在实施一种优惠券/优惠券系统,用户可以为特定产品购买一对多的优惠券。例如,用户可以在零售商X上以折扣价购买两张用于购买软饮料的优惠券。优惠券可以同时或在两个不同的时间点领取,即今天领取一张,明天领取另一张。

将优惠券添加到购物车后,将生成订单以及每个优惠券+数量的相关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

一旦购买成功,就结束了。

到目前为止,我已经找到了这个answer,但是我很难从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

更新:

我正在使用数据条来处理付款,因此Order模型有一个charge_id来存储数据条令牌-希望有帮助。

1 个答案:

答案 0 :(得分:1)

我不会在订单商品和优惠券/代金券上使用相同的表格。如果我在您的位置,则将删除order_item表中的Claim_on字段并创建一个子表

min(d, ...)