Module: Workflow::Adapter::ActiveRecord::Scopes

Defined in:
lib/workflow/adapters/active_record.rb

Overview

This module will automatically generate ActiveRecord scopes based on workflow states. The name of each generated scope will be something like ‘with_<state_name>_state`

Examples:

Article.with_pending_state # => ActiveRecord::Relation Payment.without_refunded_state # => ActiveRecord::Relation ‘ Example above just adds `where(:state_column_name => ’pending’)‘ or `where.not(:state_column_name => ’pending’)‘ to AR query and returns ActiveRecord::Relation.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(object) ⇒ Object



46
47
48
49
50
51
# File 'lib/workflow/adapters/active_record.rb', line 46

def self.extended(object)
  class << object
    alias_method :workflow_without_scopes, :workflow unless method_defined?(:workflow_without_scopes)
    alias_method :workflow, :workflow_with_scopes
  end
end

Instance Method Details

#workflow_with_scopes(column = nil, &specification) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/workflow/adapters/active_record.rb', line 53

def workflow_with_scopes(column=nil, &specification)
  workflow_without_scopes(column, &specification)
  states = workflow_spec.states.values

  states.each do |state|
    define_singleton_method("with_#{state}_state") do
      where("#{table_name}.#{self.workflow_column.to_sym} = ?", state.value)
    end

    define_singleton_method("without_#{state}_state") do
      where("#{table_name}.#{self.workflow_column.to_sym} != ?", state.value)
    end

    define_method("without_#{state}_state") do
      where("#{table_name}.#{self.workflow_column.to_sym} <> ?", state.to_s)
    end
  end
end