diff --git a/lib/sequenced/acts_as_sequenced.rb b/lib/sequenced/acts_as_sequenced.rb index 7e97350..8a28c1b 100644 --- a/lib/sequenced/acts_as_sequenced.rb +++ b/lib/sequenced/acts_as_sequenced.rb @@ -29,6 +29,10 @@ module ClassMethods # :skip - Skips the sequential ID generation when the lambda # expression evaluates to nil. Gets passed the # model object + # :secondary + # :column - Column for secondary index + # :value - lambda expression that you want to use to generate value for secondary index. + # Accepts two attributes: record and next_id # # Examples # diff --git a/lib/sequenced/generator.rb b/lib/sequenced/generator.rb index ec65975..bac492a 100644 --- a/lib/sequenced/generator.rb +++ b/lib/sequenced/generator.rb @@ -1,6 +1,6 @@ module Sequenced class Generator - attr_reader :record, :scope, :column, :start_at, :skip + attr_reader :record, :scope, :column, :start_at, :skip, :secondary_column, :secondary_value_generator def initialize(record, options = {}) @record = record @@ -8,12 +8,15 @@ def initialize(record, options = {}) @column = options[:column].to_sym @start_at = options[:start_at] @skip = options[:skip] + @secondary_column = options.dig(:secondary, :column) + @secondary_value_generator = options.dig(:secondary, :value) end def set return if skip? || id_set? lock_table record.send(:"#{column}=", next_id) + set_secondary_sequence(next_id) end def id_set? @@ -79,5 +82,10 @@ def max(*values) values.to_a.max end + def set_secondary_sequence(next_id) + return if secondary_column.blank? || secondary_value_generator.blank? + + record.send(:"#{secondary_column}=", secondary_value_generator.call(record, next_id)) + end end end