class Statesman::Adapters::ActiveRecordQueries::QueryBuilder

Attributes

initial_state[R]
model[R]
transition_class[R]

Public Class Methods

new(model, transition_class:, initial_state:, most_recent_transition_alias: nil, transition_name: nil) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 85
def initialize(model, transition_class:, initial_state:,
               most_recent_transition_alias: nil,
               transition_name: nil)
  @model = model
  @transition_class = transition_class
  @initial_state = initial_state
  @most_recent_transition_alias = most_recent_transition_alias
  @transition_name = transition_name
end

Public Instance Methods

most_recent_transition_join() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 105
def most_recent_transition_join
  "LEFT OUTER JOIN #{model_table} AS #{most_recent_transition_alias} " \
     "ON #{model.table_name}.#{model_primary_key} = " \
          "#{most_recent_transition_alias}.#{model_foreign_key} " \
     "AND #{most_recent_transition_alias}.most_recent = #{db_true}"
end
states_where(states) click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 95
def states_where(states)
  if initial_state.to_s.in?(states.map(&:to_s))
    "#{most_recent_transition_alias}.to_state IN (?) OR " \
    "#{most_recent_transition_alias}.to_state IS NULL"
  else
    "#{most_recent_transition_alias}.to_state IN (?) AND " \
    "#{most_recent_transition_alias}.to_state IS NOT NULL"
  end
end

Private Instance Methods

db_true() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 147
def db_true
  ::ActiveRecord::Base.connection.quote(true)
end
model_foreign_key() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 134
def model_foreign_key
  transition_reflection.foreign_key
end
model_primary_key() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 130
def model_primary_key
  transition_reflection.active_record_primary_key
end
model_table() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 138
def model_table
  transition_reflection.table_name
end
most_recent_transition_alias() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 142
def most_recent_transition_alias
  @most_recent_transition_alias ||
    "most_recent_#{transition_name.to_s.singularize}"
end
transition_name() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 116
def transition_name
  @transition_name || transition_class.table_name.to_sym
end
transition_reflection() click to toggle source
# File lib/statesman/adapters/active_record_queries.rb, line 120
def transition_reflection
  model.reflect_on_all_associations(:has_many).each do |value|
    return value if value.klass == transition_class
  end

  raise MissingTransitionAssociation,
        "Could not find has_many association between #{self.class} " \
        "and #{transition_class}."
end