class Object

Public Instance Methods

add_finites(args) click to toggle source
# File lib/active_finite.rb, line 9
def add_finites args
  modify_finite args do |vs, klass, column_name|
    if not klass.table_exists?
      ActiveRecord::Schema.define do
        create_table klass.table_name do |t|
          t.string column_name, :null => false
        end
        add_index klass.table_name, column_name, :unique => true
      end
    end
    MasterTable.add klass.table_name
    vs.each do |v|
      obj = klass.new
      obj.send column_name.to_s + '=', v
      obj.save
    end
  end
end
all_finites() click to toggle source
# File lib/active_finite.rb, line 5
def all_finites
  MasterTable.all
end
as_class_name(table_name) click to toggle source
# File lib/as_class_name.rb, line 3
def as_class_name table_name
  table_name.to_s.singularize.capitalize.to_sym
end
default_column_name(table_name) click to toggle source
# File lib/active_finite.rb, line 84
def default_column_name table_name
  (table_name.to_s.singularize.downcase + '_value').to_sym
end
delete_finites(args) click to toggle source
# File lib/active_finite.rb, line 28
def delete_finites args
  delete_all = args[:values] == :all
  if delete_all
    args[:values] = []
  end
  modify_finite args do |vs, klass, column_name|
    MasterTable.add klass.table_name
    if delete_all
      klass.all.each do |o|
        klass.destroy o
      end
    else
      vs.each do |v|
        objs = klass.where column_name => v
        objs.each do |o|
          klass.destroy o
        end
      end
    end
    if klass.count.eql? 0
      ActiveRecord::Schema.define do
        drop_table klass.table_name
      end
      MasterTable.delete klass.table_name
      Object.send 'remove_const', klass.to_s.to_sym
    end
  end
end
get_finite(sym, *args) click to toggle source
# File lib/get_finite.rb, line 5
def get_finite sym, *args
  class_name = as_class_name sym
  class_not_defined = not(Object.const_defined? class_name)
  should_force = args.any? {|x| x == :force}
  if class_not_defined or should_force
    anon = Class.new ActiveRecord::Base
    Object.const_set class_name, anon
  else
    anon = Object.const_get class_name
  end
  if anon.respond_to? :table_exists? and anon.table_exists?
    anon.class_eval do
      method_name = anon.send(:new).attributes.keys[0]
      define_method(:get_value) do
        self.send method_name
      end
      define_method(:set_with_existing_value) do |value|
        result = anon.send 'find_by_' + method_name + '!', value 
        self.send anon.primary_key + '=', result.send(anon.primary_key)
        self.send method_name + '=', result.send(method_name)
      end
    end
  end
  anon
end
modify_finite(args) { |to_be_modified, klass, column_name| ... } click to toggle source
# File lib/active_finite.rb, line 57
def modify_finite args
  table_name = args[:in_table]
  if table_name.nil?
    raise 'A table name must be specified for :in_table.'
  end
  file_name   = args[:from_file] 
  values      = args[:values]
  column_name = args[:column_name] || default_column_name(table_name)
  if values.nil? and file_name.nil?
    raise 'Either :from_file or :values must be specified.'
  end

  to_be_modified = Array.new
  if not values.nil?
    to_be_modified = to_be_modified.concat values
  end

  if not file_name.nil?
    to_be_modified = to_be_modified.concat JSON.load open file_name
  end

  klass = get_finite table_name, :do_not_redefine_accessor
  ActiveRecord::Base.transaction do
    yield to_be_modified, klass, column_name
  end
end