Sha256: 410c8fb6bb4c8d3f050139e2a46aebf2f7db4f57f430dba2029e9a751c9eff97

Contents?: true

Size: 1.42 KB

Versions: 4

Compression:

Stored size: 1.42 KB

Contents

require_relative "../exceptions"

module Statesman
  module Adapters
    class ActiveRecord
      attr_reader :transition_class
      attr_reader :parent_model

      def initialize(transition_class, parent_model)
        unless transition_class.serialized_attributes.include?("metadata")
          raise UnserializedMetadataError,
                "#{transition_class.name}#metadata is not serialized"
        end
        @transition_class = transition_class
        @parent_model = parent_model
      end

      def create(to, before_cbs, after_cbs, metadata = {})
        transition = transitions_for_parent.build(to_state: to,
                                                  sort_key: next_sort_key,
                                                  metadata: metadata)

        ::ActiveRecord::Base.transaction do
          before_cbs.each { |cb| cb.call(@parent_model, transition) }
          transition.save!
          after_cbs.each { |cb| cb.call(@parent_model, transition) }
          @last_transition = nil
        end

        transition
      end

      def history
        transitions_for_parent.order(:sort_key)
      end

      def last
        @last_transition ||= transitions_for_parent.order(:sort_key).last
      end

      private

      def transitions_for_parent
        @parent_model.send(@transition_class.table_name)
      end

      def next_sort_key
        (last && last.sort_key + 10) || 0
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
statesman-0.3.0 lib/statesman/adapters/active_record.rb
statesman-0.2.1 lib/statesman/adapters/active_record.rb
statesman-0.2.0 lib/statesman/adapters/active_record.rb
statesman-0.1.0 lib/statesman/adapters/active_record.rb