lib/active_finite.rb in active_finite-0.1.3 vs lib/active_finite.rb in active_finite-0.1.4

- old
+ new

@@ -2,33 +2,105 @@ require 'find' require 'active_support/inflector' require 'active_record' require 'json' -def active_finite sym - anon = Class.new ActiveRecord::Base - Object.const_set(sym.to_s.singularize.capitalize, anon) +def get_finite_table 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 + Object.const_get class_name + end end -def create_finite args +def as_class_name table_name + table_name.to_s.singularize.capitalize.to_sym +end + +def all_finite_tables + master = get_finite_table(master_table_name) + if master.table_exists? + master + .where("#{default_column_name} != ?", master_table_name) + .collect {|x| x.send default_column_name.to_s} + .collect {|x| get_finite_table x} + else + [] + end +end + +def master_table_name + :active_finites +end + +def add_to_master table_name + add_finites in_table: master_table_name, values: [table_name] +end + +def delete_from_master table_name + delete_finites in_table: master_table_name, values: [table_name] +end + +def is_in_master_table? table_name + if table_name.eql? master_table_name + true + else + get_finite_table(master_table_name) + .where("#{default_column_name} != ?", master_table_name) + .where("#{default_column_name} == ?", table_name) + .any? + end +end + + +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 + end + add_to_master klass.table_name + end vs.each do |v| obj = klass.new obj.send column_name.to_s + '=', v obj.save end end end -def drop_finite args +def delete_finites args, + delete_all = args[:values] == :all + if delete_all + args[:values] = [] + end modify_finite args do |vs, klass, column_name| - vs.each do |v| - objs = klass.where column_name => v - objs.each do |o| + 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 + delete_from_master klass.table_name + Object.send 'remove_const', klass.to_s.to_sym + end end end def modify_finite args table_name = args[:in_table] @@ -49,10 +121,10 @@ if not file_name.nil? to_be_modified = to_be_modified.concat JSON.load open file_name end - klass = active_finite table_name + klass = get_finite_table table_name ActiveRecord::Base.transaction do yield to_be_modified, klass, column_name end end