所以这就是我想做的:当用户创建一个特别优惠时,他写下应该有多少优惠券。每一张优惠券都以一个唯一的代码存储在数据库中。
的例子:
他想卖100张"晚餐优惠"的优惠券。当他创建"晚餐优惠"并输入他想要100张优惠券时,这100张优惠券就会生成。我该怎么做?
谢谢。
很难说你是在寻求帮助。您是否不确定如何生成唯一的优惠券代码,不确定如何对其建模,不确定如何一次创建多个记录?我将试着给出一个大概的答案,如果我正在构建这个,我会怎么做,也许这会对你有所帮助。
我将创建两个模型,Offer
和Coupon
:
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
列上的数据库并使其唯一,并禁止code
为nil
。不妨让两列都禁用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个字符的代码。