Module: Familia::Horreum::RelatedFieldsManagement
- Included in:
- DefinitionMethods, ManagementMethods
- Defined in:
- lib/familia/horreum/subclass/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_related_fields_accessors to initialize the feature
Defined Under Namespace
Modules: RelatedFieldsAccessors
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
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 147 148 149 150 151 |
# File 'lib/familia/horreum/subclass/related_fields_management.rb', line 122 def (name, klass, opts) Familia.trace :attach_class_related_field, "#{name} #{klass}", opts, caller(1..1) if Familia.debug? 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
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/familia/horreum/subclass/related_fields_management.rb', line 97 def (name, klass, opts) Familia.trace :attach_instance, "#{name} #{klass}", opts, caller(1..1) if Familia.debug? 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 |