module SeqSeq::Base
Public Class Methods
next_val(seq_name, criteria, opts = {})
click to toggle source
# File lib/seqseq.rb, line 8 def self.next_val(seq_name, criteria, opts = {}) opts.reverse_merge!(:start_with => 1, :step_by => 1) throw ArgumentError, "start_with or step_by options must be integer" unless [:start_with, :step_by].all?{ |_| opts[_].is_a? Integer } result = nil begin rec = if Rails.version > '4.0' find_or_create_by(:seq_name => seq_name.to_s, :criteria => criteria.to_s) else find_or_create_by_seq_name_and_criteria(seq_name.to_s, criteria.to_s) end rec.with_lock do rec.start_with ||= opts[:start_with] rec.step_by ||= opts[:step_by] result = (rec.next_val ||= rec.start_with) rec.next_val += rec.step_by rec.save! end result rescue ActiveRecord::RecordNotUnique retry end end