Module: DBStruct
- Defined in:
- lib/dbstruct.rb
Defined Under Namespace
Modules: DBStructClassMethods
Class Method Summary collapse
-
.included(receiver) ⇒ Object
Class methods for included dbstructs.
Instance Method Summary collapse
- #delete(db, search_criteria) ⇒ Object
-
#empty? ⇒ Boolean
Avoid anyone referencing @_dbdata directly.
-
#freeze_fields ⇒ Object
Freeze struct so new fields aren’t added by mistake.
- #get(db, pkid) ⇒ Object
- #insert(db) ⇒ Object
-
#load(response) ⇒ Object
Used for creating an object based on an hash (primarily for loading records directly from DB.
-
#method_missing(mid, *args) ⇒ Object
Define dynamic accessors to struct fields.
-
#respond_to(*args) ⇒ Object
When overiding method_missing this one should also be…
-
#save(*args) ⇒ Object
Export hash from struct.
-
#setup_fields(fields) ⇒ Object
Define which fields are needed.
-
#unfreeze_fields ⇒ Object
Unfreeze struct so new fields can be added manually.
- #update(db) ⇒ Object
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(mid, *args) ⇒ Object
Define dynamic accessors to struct fields
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/dbstruct.rb', line 12 def method_missing(mid, *args) fieldname = mid.id2name if mid.id2name.match("=") fieldname.chop! if args.length != 1 raise ArgumentError, "Setter must have only one argument. Number of arguments found was (#{len} for 1)", caller(1) end # Make sure fields aren't added in error (typos) if !@_dbdata.marshal_dump.key?(fieldname.to_sym) & @_frozen raise ArgumentError, "Struct fields are frozen, reopen before using <field>= . Field was (#{fieldname} for 1)", caller(1) end end if @_dbdata == nil super(mid, *args) elsif @_dbdata.marshal_dump.key?(fieldname.to_sym) @_dbdata.send(mid.id2name,args[0]) # Route method missing to struct object elsif !@_frozen & mid.id2name.match("=") @_dbdata.method_missing(mid, *args) # Forward methods missing not related to struct else super(mid, *args) end end |
Class Method Details
.included(receiver) ⇒ Object
Class methods for included dbstructs
110 111 112 |
# File 'lib/dbstruct.rb', line 110 def self.included receiver receiver.extend DBStructClassMethods end |
Instance Method Details
#delete(db, search_criteria) ⇒ Object
65 66 67 |
# File 'lib/dbstruct.rb', line 65 def delete(db,search_criteria) db[self.class.get_table].filter({:pkid =>pkid}).delete end |
#empty? ⇒ Boolean
Avoid anyone referencing @_dbdata directly
90 91 92 |
# File 'lib/dbstruct.rb', line 90 def empty? @_dbdata == nil end |
#freeze_fields ⇒ Object
Freeze struct so new fields aren’t added by mistake
100 101 102 |
# File 'lib/dbstruct.rb', line 100 def freeze_fields @_frozen = true end |
#get(db, pkid) ⇒ Object
56 57 58 |
# File 'lib/dbstruct.rb', line 56 def get(db, pkid) @_dbdata.pkid = db[self.class.get_table].filter(:pkid =>pkid) end |
#insert(db) ⇒ Object
61 62 63 |
# File 'lib/dbstruct.rb', line 61 def insert(db) @_dbdata.pkid = db[self.class.get_table].insert(save) end |
#load(response) ⇒ Object
Used for creating an object based on an hash (primarily for loading records directly from DB
44 45 46 47 48 49 |
# File 'lib/dbstruct.rb', line 44 def load(response) if response != nil @_dbdata = OpenStruct.new(response) @_frozen = true end end |
#respond_to(*args) ⇒ Object
When overiding method_missing this one should also be…
95 96 97 |
# File 'lib/dbstruct.rb', line 95 def respond_to(*args) super(*args) end |
#save(*args) ⇒ Object
Export hash from struct
52 53 54 |
# File 'lib/dbstruct.rb', line 52 def save(*args) @_dbdata.marshal_dump(*args) end |
#setup_fields(fields) ⇒ Object
Define which fields are needed. Sent in as an array of symbols or strings
76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/dbstruct.rb', line 76 def setup_fields(fields) h = {} fields.each do |field| if field.kind_of? Symbol h[field.to_s] = nil else h[field] = nil end end @_dbdata = OpenStruct.new(fields) @_frozen = true end |
#unfreeze_fields ⇒ Object
Unfreeze struct so new fields can be added manually. Remember to freeze afterwards
105 106 107 |
# File 'lib/dbstruct.rb', line 105 def unfreeze_fields @_frozen = false end |
#update(db) ⇒ Object
70 71 72 |
# File 'lib/dbstruct.rb', line 70 def update(db) db[self.class.get_table].filter({:pkid => pkid}).update(save) end |