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
19 20 21 22 |
# File 'lib/familia/horreum/relations_management.rb', line 19 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
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/familia/horreum/relations_management.rb', line 108 def attach_class_redis_object_relation(name, klass, opts) Familia.ld "[#{self}] Attaching class-level #{name} #{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
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/familia/horreum/relations_management.rb', line 83 def attach_instance_redis_object_relation(name, klass, opts) Familia.ld "[Attaching instance-level #{name}] #{klass} => (#{self}) #{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 |