Module: Familia::Horreum::RelatedFieldsManagement
- Included in:
- ClassMethods
- Defined in:
- lib/familia/horreum/related_fields_management.rb
Overview
RelatedFieldsManagement: Manages DataType fields and relations
This module uses metaprogramming to dynamically create methods for managing different types of Database objects (e.g., sets, lists, hashes).
Key metaprogramming features: * Dynamically defines methods for each Database type (e.g., set, list, hashkey) * Creates both instance-level and class-level relation methods * Provides query methods for checking relation types
Usage: Include this module in classes that need DataType management Call setup_relations_accessors to initialize the feature
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
-
#attach_class_related_field(name, klass, opts) ⇒ Object
Creates a class-level relation.
-
#attach_instance_related_field(name, klass, opts) ⇒ Object
Creates an instance-level relation.
Instance Method Details
#attach_class_related_field(name, klass, opts) ⇒ Object
Creates a class-level relation
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/familia/horreum/related_fields_management.rb', line 117 def (name, klass, opts) Familia.ld "[#{self}.#{name}] Attaching class-level #{klass} #{opts}" raise ArgumentError, 'Name is blank (klass)' if name.to_s.empty? name = name.to_s.to_sym opts = opts.nil? ? {} : opts.clone opts[:parent] = self unless opts.key?(:parent) [name] = Struct.new(:name, :klass, :opts).new [name].name = name [name].klass = klass [name].opts = opts # An accessor method created in the metaclass will # access the instance variables for this class. singleton_class.attr_reader name define_singleton_method :"#{name}=" do |v| send(name).replace v end define_singleton_method :"#{name}?" do !send(name).empty? end = klass.new name, opts .freeze instance_variable_set(:"@#{name}", ) [name] end |
#attach_instance_related_field(name, klass, opts) ⇒ Object
Creates an instance-level relation
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/familia/horreum/related_fields_management.rb', line 92 def (name, klass, opts) Familia.ld "[#{self}##{name}] Attaching instance-level #{klass} #{opts}" raise ArgumentError, "Name is blank (#{klass})" if name.to_s.empty? name = name.to_s.to_sym opts ||= {} [name] = Struct.new(:name, :klass, :opts).new [name].name = name [name].klass = klass [name].opts = opts attr_reader name define_method :"#{name}=" do |val| send(name).replace val end define_method :"#{name}?" do !send(name).empty? end [name] end |