Rails为同一记录创建多个令牌(为一个优惠创建多个优惠券)



所以这就是我想做的:当用户创建一个特别优惠时,他写下应该有多少优惠券。每一张优惠券都以一个唯一的代码存储在数据库中。

的例子:

他想卖100张"晚餐优惠"的优惠券。当他创建"晚餐优惠"并输入他想要100张优惠券时,这100张优惠券就会生成。我该怎么做?

谢谢。

很难说你是在寻求帮助。您是否不确定如何生成唯一的优惠券代码,不确定如何对其建模,不确定如何一次创建多个记录?我将试着给出一个大概的答案,如果我正在构建这个,我会怎么做,也许这会对你有所帮助。

我将创建两个模型,OfferCoupon:

rails g model offer title:string user:references
rails g model coupon offer:references code:uuid

我不知道你用的是mysql还是postgresql。我认为uuid只会在postgresql上工作。如果你使用mysql我猜使代码列字符串代替。或者更好的是,切换到postgresql。;)

class Offer < ActiveRecord::Base
  belongs_to :user
  has_many :coupons
end
class Coupon < ActiveRecord::Base
  belongs_to :coupon
  before_create -> { self.code = SecureRandom.uuid }
end

我将索引您的code列上的数据库并使其唯一,并禁止codenil。不妨让两列都禁用nil,我坚信在数据库中尽可能这样做:

class CreateCoupons < ActiveRecord::Migration
  def change
    create_table :coupons do |t|
      t.references :offer, index: true, null: false
      t.uuid :code, null: false
    end
    add_index :coupons, :code, unique: true
  end
end

通常当你创建优惠券时,你只需要做:

offer.coupons.create!

它将在before_create钩子中为您生成代码。但是因为你想一次创建100个,简单的方法是:

100.times { offer.coupons.create! }

但是这样会有点低效。我不知道如何让Rails对许多记录进行有效的INSERT,所以我们将手动执行:

objs = []
100.times do
  objs.push "(#{offer.id}, '#{SecureRandom.uuid}', '#{Time.now}', '#{Time.now}')"
end
Coupon.connection.execute("INSERT INTO coupons (offer_id, code, created_at, updated_at) VALUES #{objs.join(", ")}")

如果有更合理的方式,请告诉我们。

IMO,最好让优惠券本身生成优惠券代码,这样可以使整个系统的代码长度相同。

amount_of_coupons = 100
amount_of_coupons.times do
    offer.coupons.create({:attr => value})
end
class Coupon < ActiveRecord::Base
    attr_accessible :code
    before_create :set_coupon_code
    def set_coupon_code
        self.code = SecureRandom.hex(32) unless self.code
    end
end

我假设您已经拥有具有has_many: Coupon关系的模型Offer,并且您的Coupon模型具有belongs_to: Offer关系。

如果是,那么你可以做

amount_of_coupons = params[:amount_of_coupons]
offer = Offer.create params.permit(:attr1, :attr2)
offer.coupons.create Array.new(amount_of_coupons).map{ {code: (0...64).map{ (65 + rand(26)).chr }.join} }

,它将创建100张与您的优惠相关的优惠券,并随机生成64个字符的代码。

相关内容

  • 没有找到相关文章

最新更新