class ActiveEnumeration::Base

Public Class Methods

all() click to toggle source
# File lib/active_enumeration/base.rb, line 21
def self.all
  @active_enumeration_values.keys.map { |id| self.find(id) }
end
count() click to toggle source
# File lib/active_enumeration/base.rb, line 25
def self.count
  @active_enumeration_values.count
end
find(id) click to toggle source
# File lib/active_enumeration/base.rb, line 6
def self.find(id)
  id = id.to_i
  @instances ||= {}
  unless @instances[id] || !@active_enumeration_values[id]
    @instances[id] = self.new *@active_enumeration_values[id]
  end
  @instances[id]
end
new(*attributes) click to toggle source
# File lib/active_enumeration/base.rb, line 45
def initialize(*attributes)
  key_index = self.class.active_enumeration_index_location
  self.instance_variable_set("@active_enumeration_id", attributes[key_index].to_i)

  self.class.active_enumeration_attributes.each_with_index do |attr_name, index|
    self.instance_variable_set("@#{attr_name}", attributes[index])
  end
end
to_a() click to toggle source
# File lib/active_enumeration/base.rb, line 29
def self.to_a
  all.map { |e| [e.to_s, e.instance_variable_get("@active_enumeration_id")] }
end
where(filters) click to toggle source
# File lib/active_enumeration/base.rb, line 15
def self.where(filters)
  self.all.select do |enum|
    filters.keys.all? { |k| enum.send(k) == filters[k] }
  end
end

Protected Class Methods

active_enumeration_attributes() click to toggle source
# File lib/active_enumeration/base.rb, line 54
def self.active_enumeration_attributes
  @active_enumeration_attributes
end
active_enumeration_index_location() click to toggle source
# File lib/active_enumeration/base.rb, line 62
def self.active_enumeration_index_location
  active_enumeration_attributes.index(:id) || 0
end
active_enumeration_symbols() click to toggle source
# File lib/active_enumeration/base.rb, line 58
def self.active_enumeration_symbols
  @active_enumeration_symbols
end
attr_reader(*attributes) click to toggle source
Calls superclass method
# File lib/active_enumeration/base.rb, line 39
def self.attr_reader(*attributes)
  super
  @active_enumeration_attributes ||= []
  @active_enumeration_attributes.concat(attributes.map(&:to_sym))
end
belongs_to(name, options = {}) click to toggle source
# File lib/active_enumeration/base.rb, line 85
def self.belongs_to(name, options = {})
  class_name = (options[:class_name] || name.to_s.camelize).to_s
  foreign_key = (options[:foreign_key] || "#{name}_id").to_s
  
  self.send(:define_method, name) {
    klass = class_name.constantize
    klass.find(self.send(foreign_key))
  }

  self.send(:define_singleton_method, "active_enumeration_belongs_to_#{class_name.underscore}".upcase) {
    var_name = "@active_enumeration_belongs_to_#{class_name.underscore}"
    return instance_variable_get(var_name) if instance_variable_get(var_name)
    hash = Hash.new {Array.new}
    self.all.each do |obj|
      hash[obj.send(foreign_key)] = hash[obj.send(foreign_key)] << obj
    end
    instance_variable_set(var_name, hash)
    hash
  }
end
groups(hash) click to toggle source
# File lib/active_enumeration/base.rb, line 77
def self.groups(hash)
  hash.each do |group, ids|
    self.send(:define_singleton_method, group) do
      ids.map { |id| self.find(id) }
    end
  end
end
has_many(name, options = {}) click to toggle source
# File lib/active_enumeration/base.rb, line 106
def self.has_many(name, options = {})
  class_name = (options[:class_name] || name.to_s.singularize.camelize).to_s
  self.send(:define_method, name) {
    klass = class_name.constantize
    klass.send("active_enumeration_belongs_to_#{self.class.name.underscore}".upcase)[self.id]
  }
end
values(values) click to toggle source
# File lib/active_enumeration/base.rb, line 66
def self.values(values)
  @active_enumeration_values ||= Hash.new
  @active_enumeration_symbols ||= Hash.new

  if values.class == Hash
    values.each_with_index { |(k, v), i| handle_hash_values(k, v, i) }
  elsif values.class == Array
    values.each_with_index { |v, i| handle_array_values(v, i) }
  end
end

Private Class Methods

handle_array_values(v, i) click to toggle source
# File lib/active_enumeration/base.rb, line 133
def self.handle_array_values(v, i)
  v = [v] unless v.class == Array
  values_key = v[active_enumeration_index_location].to_i
  @active_enumeration_values[values_key] = v
end
handle_hash_values(k, v, i) click to toggle source
# File lib/active_enumeration/base.rb, line 116
def self.handle_hash_values(k, v, i)
  v = [v] unless v.class == Array
  values_key = v[active_enumeration_index_location].to_i
  @active_enumeration_values[values_key] = v

  unless active_enumeration_attributes.index(:symbol)
    @active_enumeration_symbols[values_key] = k.to_sym
    self.send(:define_method, :symbol) { self.class.active_enumeration_symbols[self.instance_variable_get("@active_enumeration_id")] }
  end

  self.send(:define_singleton_method, k) { self.find(values_key) }

  self.send(:define_method, "#{k}?") { self.instance_variable_get("@active_enumeration_id") == values_key }

  const_set(k.to_s.upcase, values_key)
end

Public Instance Methods

symbol() click to toggle source
# File lib/active_enumeration/base.rb, line 33
def symbol
  self.instance_variable_get("@symbol")
end