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

时间:2014-07-04 21:35:00

标签: ruby-on-rails ruby ruby-on-rails-4 multiple-records

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

示例:

他希望出售100张优惠券,以及#34;晚餐优惠"。当他创造晚餐报价时#34;和类型,他想要100张优惠券,这些100张优惠券应该生成。 我该怎么做?

感谢。

3 个答案:

答案 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)

很难说出你要求帮助的部分内容。您不确定如何生成唯一的优惠券代码,不确定如何建模,不确定如何一次创建多个记录?如果我正在构建这个内容,我会尽量回答一下我会做些什么,也许这会对你有所帮助。

我创建了两个模型,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列上的数据库编入索引并使其唯一,并禁止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方式,请有人告诉我们。