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

Instance Method Details

Creates a class-level relation

Raises:

  • (ArgumentError)


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 attach_class_related_field(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)

  class_related_fields[name] = Struct.new(:name, :klass, :opts).new
  class_related_fields[name].name = name
  class_related_fields[name].klass = klass
  class_related_fields[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

  related_field = klass.new name, opts
  related_field.freeze
  instance_variable_set(:"@#{name}", related_field)

  class_related_fields[name]
end

Creates an instance-level relation

Raises:

  • (ArgumentError)


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 attach_instance_related_field(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 ||= {}

  related_fields[name] = Struct.new(:name, :klass, :opts).new
  related_fields[name].name = name
  related_fields[name].klass = klass
  related_fields[name].opts = opts

  attr_reader name

  define_method :"#{name}=" do |val|
    send(name).replace val
  end
  define_method :"#{name}?" do
    !send(name).empty?
  end

  related_fields[name]
end