Module: Familia::Horreum::RelationsManagement
- Included in:
- ClassMethods
- Defined in:
- lib/familia/horreum/relations_management.rb
Overview
RelationsManagement: Manages Redis-type fields and relations
This module uses metaprogramming to dynamically create methods for managing different types of Redis objects (e.g., sets, lists, hashes).
Key metaprogramming features:
-
Dynamically defines methods for each Redis 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 Redis-type management
Call setup_relations_accessors to initialize the feature
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
Instance Method Summary collapse
-
#attach_class_redis_object_relation(name, klass, opts) ⇒ Object
Creates a class-level relation.
-
#attach_instance_redis_object_relation(name, klass, opts) ⇒ Object
Creates an instance-level relation.
Class Method Details
.included(base) ⇒ Object
23 24 25 26 |
# File 'lib/familia/horreum/relations_management.rb', line 23 def self.included(base) base.extend(ClassMethods) base.setup_relations_accessors end |
Instance Method Details
#attach_class_redis_object_relation(name, klass, opts) ⇒ Object
Creates a class-level relation
115 116 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 |
# File 'lib/familia/horreum/relations_management.rb', line 115 def attach_class_redis_object_relation(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) class_redis_types[name] = Struct.new(:name, :klass, :opts).new class_redis_types[name].name = name class_redis_types[name].klass = klass class_redis_types[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 redis_object = klass.new name, opts redis_object.freeze instance_variable_set(:"@#{name}", redis_object) class_redis_types[name] end |
#attach_instance_redis_object_relation(name, klass, opts) ⇒ Object
Creates an instance-level relation
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/familia/horreum/relations_management.rb', line 90 def attach_instance_redis_object_relation(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 ||= {} redis_types[name] = Struct.new(:name, :klass, :opts).new redis_types[name].name = name redis_types[name].klass = klass redis_types[name].opts = opts attr_reader name define_method :"#{name}=" do |val| send(name).replace val end define_method :"#{name}?" do !send(name).empty? end redis_types[name] end |