module ModelConcerns::Sequenable::ClassMethods

Public Instance Methods

sequence(prefix = nil) click to toggle source
# File lib/model_concerns/sequenable.rb, line 8
      def sequence(prefix = nil)
        class_eval <<-CODE, __FILE__, __LINE__ + 1
          after_initialize :generate_no
          validates_uniqueness_of :no

          private
          def generate_no
            # 如果序号为空,或者已经被锁定了,就重新创建一个序号
            file = File.open("/tmp/locks/" + self.class.name.underscore.pluralize + "_no.lock", "w")
            file.flock(File::LOCK_EX)

            if self.no.blank?
              self.no = Time.now.strftime("#{prefix}%y%m%d%H%M%S%L")
              sleep(0.001)
            end

            file.flock(File::LOCK_UN)
          end

        CODE
      end