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

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

Raises:

  • (ArgumentError)


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

Raises:

  • (ArgumentError)


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