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



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

Raises:

  • (ArgumentError)


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

Raises:

  • (ArgumentError)


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