所以这就是我要做的事情: 当用户创建特别优惠时,他会记下应该有多少优惠券。这些优惠券中的每一个都使用唯一代码存储在数据库中。
示例:
他希望出售100张优惠券,以及#34;晚餐优惠"。当他创造晚餐报价时#34;和类型,他想要100张优惠券,这些100张优惠券应该生成。 我该怎么做?
感谢。
答案 0 :(得分:0)
我假设您已经拥有优惠券模式的优惠,并且您的优惠券模型具有 belongs_to:提供关系。
如果是,那么你可以做
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个字符的代码。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
很难说出你要求帮助的部分内容。您不确定如何生成唯一的优惠券代码,不确定如何建模,不确定如何一次创建多个记录?如果我正在构建这个内容,我会尽量回答一下我会做些什么,也许这会对你有所帮助。
我创建了两个模型,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(", ")}")
如果有更多Railsy方式,请有人告诉我们。