class Statesman::Adapters::ActiveRecordQueries::ClassMethods

Public Class Methods

new(**args) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 37
def initialize(**args)
  @args = args
end

Public Instance Methods

included(base) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 41
def included(base)
  ensure_inheritance(base)

  query_builder = QueryBuilder.new(base, **@args)

  base.define_singleton_method(:most_recent_transition_join) do
    query_builder.most_recent_transition_join
  end

  define_in_state(base, query_builder)
  define_not_in_state(base, query_builder)
end

Private Instance Methods

define_in_state(base, query_builder) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 65
def define_in_state(base, query_builder)
  base.define_singleton_method(:in_state) do |*states|
    states = states.flatten

    joins(most_recent_transition_join).
      where(query_builder.states_where(states), states)
  end
end
define_not_in_state(base, query_builder) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 74
def define_not_in_state(base, query_builder)
  base.define_singleton_method(:not_in_state) do |*states|
    states = states.flatten

    joins(most_recent_transition_join).
      where("NOT (#{query_builder.states_where(states)})", states)
  end
end
ensure_inheritance(base) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 56
def ensure_inheritance(base)
  klass = self
  existing_inherited = base.method(:inherited)
  base.define_singleton_method(:inherited) do |subclass|
    existing_inherited.call(subclass)
    subclass.send(:include, klass)
  end
end