rails 自增长

/lib/document_number.rb

class DocumentNumber
  TIME_TO_WAIT = 1

  def initialize(document)
    @sequence = "#{document}_number_seq"
  end

  def get(time_prefix_format = '%y%m%d', number_of_digits = 6)
    prefix      = Time.zone.now.strftime(time_prefix_format)
    start_value = prefix + ('0' * number_of_digits)
    next_value  = get_uncached_sequence

    if start_value.to_i > next_value.to_i
      set_value(start_value)
      sleep(TIME_TO_WAIT)
      next_value = get_uncached_sequence
    end

    next_value
  end

  def get_uncached_sequence
    ActiveRecord::Base.uncached do
      get_sequence
    end
  end

  def get_sequence
    next_value
  rescue ActiveRecord::StatementInvalid => e # the sequence is not created yet
    create_sequence
    next_value
  end

  class << self
    def get_order_number
      number = new(:order).get('%y%m%d', 5)
      "B#{number}"
    end

    def get_sub_order_number
      number = new(:sub_order).get
      "M#{number}"
    end

    def get_bill_number
      "T#{new(:bill).get}"
    end

    def get_special_approval_number
      "S#{new(:special_approval).get}"
    end
  end

  private

  def create_sequence
    ActiveRecord::Base.connection.execute("create sequence #{@sequence}")
  end

  def next_value
    ActiveRecord::Base.connection.select_value("select nextval('#{@sequence}')")
  end

  def set_value(value)
    ActiveRecord::Base.connection.execute("select setval('#{@sequence}', #{value})")
  end
end

migration

def change
  ActiveRecord::Base.connection.execute("create sequence crowdfunding_number_seq")
end

config/application

config.autoload_paths << Rails.root.join('lib')

rails console

DocumentNumber

=> DocumentNumber

说明已经可以用这个类
model/order.rb

before_create :save_order_number 
#保存后生成认筹编码
  def save_order_number
    self.order_number = DocumentNumber.get_order_number
  end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值