module MasterRecord
Public Class Methods
included(c)
click to toggle source
# File lib/MasterRecord.rb, line 7 def self.included(c) fields = c.const_get("#{c}Fields") c.instance_variable_set("@fields",fields) def c.fields @fields end def c.create_master_record(datum) Factory.build(self.to_s,datum,@fields) end def c.load_data(datum) Object.send(:remove_const,"#{self}Data") if Object.const_defined?("#{self}Data") eval(create_master_record(datum)) self.reload end def c.reload klass = Object.const_get("#{self}Data") master_records = klass.const_get("#{self}Records") self.instance_variable_set("@master_records",master_records) end data_exist = Class.const_defined?("#{c}Data".to_sym) if data_exist klass = Object.const_get("#{c}Data") master_records = klass.const_get("#{c}Records") c.instance_variable_set("@master_records",master_records) else c.instance_variable_set("@master_records",{}) end fields.keys.each do |f| define_method(f) { @info.send(:fetch, f) } c.define_singleton_method("find_by_#{f}".to_sym)do|target| @master_records.select{|k,v| v[f] == target}.map{|k,v|c.new(k)} end c.define_singleton_method("find_one_by_#{f}".to_sym)do|target| @master_records.detect{|k,v| break c.new(k) if v[f] == target} end end def initialize(id) @id = id.to_s @identity = "#{self.class.name}@#{id}" rec = self.class.instance_variable_get("@master_records") @info = rec[@id] end def attributes @info.merge({:id => @id,:identity => @identity}) end def [](field) attributes[field.to_sym] end attr_reader :identity, :id def c.all @master_records.keys.map do |id| self.new(id) end end def c.find_one(condition=nil) if condition == nil if @master_records.count == 0 return nil else return new(@master_records.keys.first) end end if condition.is_a? Hash filtered = @master_records.detect do |id,rec| break new(id) if coincide?(id,rec,condition) end else id = condition.to_s if @master_records[id] new(id) else nil end end end def c.coincide?(id,rec,condition) condition.each do|k,v| if k.to_s == "id" break nil if id != v else break nil if rec[k.to_sym] != v end end != nil end def c.find(condition=nil) return all unless condition if condition.is_a? Hash filtered = @master_records.select do |id,rec| coincide?(id,rec,condition) end filtered.map{|k,v| new(k)} else find_one(condition) end end end
integer()
click to toggle source
# File lib/master_record/factory.rb, line 6 def self.integer lambda{|val| val.to_s} end
new(id)
click to toggle source
# File lib/MasterRecord.rb, line 51 def initialize(id) @id = id.to_s @identity = "#{self.class.name}@#{id}" rec = self.class.instance_variable_get("@master_records") @info = rec[@id] end
string()
click to toggle source
# File lib/master_record/factory.rb, line 2 def self.string lambda{|val| "'#{val}'"} end
Public Instance Methods
[](field)
click to toggle source
# File lib/MasterRecord.rb, line 62 def [](field) attributes[field.to_sym] end
attributes()
click to toggle source
# File lib/MasterRecord.rb, line 58 def attributes @info.merge({:id => @id,:identity => @identity}) end