module StateManager::Adapters::ActiveRecord::ResourceMethods::ClassMethods

Public Instance Methods

state_manager_added(property, klass, options) click to toggle source
# File lib/state_manager/adapters/active_record.rb, line 24
def state_manager_added(property, klass, options)
  class_eval do
    klass.specification.states.each do |state, specification_klass|
      # The connection might not be ready when defining this code is
      # reached so we wrap in a lamda.
      scope state, lambda {
        conn = ::ActiveRecord::Base.connection
        table = conn.quote_table_name table_name
        column = conn.quote_column_name klass._state_property
        namespaced_col = "#{table}.#{column}"
        states = [state].concat specification_klass.specification.descendant_names.map{|s| "#{state}.#{s}"}
        query = "#{namespaced_col} in (?)"
        where(query, states)
      }
    end

    after_initialize do
      self.state_managers ||= {}
    end
    before_validation do
      validate_states!
    end

    # Callback hooks
    after_commit(:on => :create) { state_managers.values.map(&:after_commit) }
    after_commit(:on => :update) { state_managers.values.map(&:after_commit) }
    before_save { state_managers.values.map(&:before_save) }
    after_save { state_managers.values.map(&:after_save) }
  end
end