Class: Familia::Features::ExternalIdentifier::ExternalIdentifierFieldType
- Inherits:
-
Familia::FieldType
- Object
- Familia::FieldType
- Familia::Features::ExternalIdentifier::ExternalIdentifierFieldType
- Defined in:
- lib/familia/features/external_identifier.rb
Overview
ExternalIdentifierFieldType - Fields that derive deterministic external identifiers
External identifier fields derive shorter, public-facing identifiers that are deterministically derived from object identifiers. These IDs are safe for use in URLs, APIs, and other external contexts where shorter IDs are preferred.
Key characteristics:
- Deterministic generation from objid ensures consistency
- Shorter than objid (128-bit vs 256-bit) for external use
- Base-36 encoding for URL-safe identifiers
- Customizable format template (default: 'ext_' prefix)
- Lazy generation preserves values from initialization
Instance Method Summary collapse
-
#category ⇒ Symbol
Category for external identifier fields.
-
#define_getter(klass) ⇒ Object
Override getter to provide lazy generation from objid.
-
#define_setter(klass) ⇒ Object
Override setter to preserve values during initialization.
-
#persistent? ⇒ Boolean
External identifier fields are persisted to database.
Constructor Details
This class inherits a constructor from Familia::FieldType
Instance Method Details
#category ⇒ Symbol
Category for external identifier fields
166 167 168 |
# File 'lib/familia/features/external_identifier.rb', line 166 def category :external_identifier end |
#define_getter(klass) ⇒ Object
Override getter to provide lazy generation from objid
Derives the external identifier deterministically from the object's objid. This ensures consistency - the same objid will always produce the same extid. Only derives when objid is available.
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/familia/features/external_identifier.rb', line 109 def define_getter(klass) field_name = @name method_name = @method_name handle_method_conflict(klass, method_name) do klass.define_method method_name do # Check if we already have a value (from initialization or previous generation) existing_value = instance_variable_get(:"@#{field_name}") return existing_value unless existing_value.nil? # Derive external identifier from objid if available derived_extid = derive_external_identifier return unless derived_extid instance_variable_set(:"@#{field_name}", derived_extid) derived_extid end end end |
#define_setter(klass) ⇒ Object
Override setter to preserve values during initialization
This ensures that values passed during object initialization (e.g., when loading from Valkey/Redis) are preserved and not overwritten by the lazy generation logic.
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/familia/features/external_identifier.rb', line 138 def define_setter(klass) field_name = @name method_name = @method_name handle_method_conflict(klass, :"#{method_name}=") do klass.define_method :"#{method_name}=" do |value| # Remove old mapping if extid is changing old_value = instance_variable_get(:"@#{field_name}") self.class.extid_lookup.remove_field(old_value) if old_value && old_value != value # Set the new value instance_variable_set(:"@#{field_name}", value) end end end |
#persistent? ⇒ Boolean
External identifier fields are persisted to database
158 159 160 |
# File 'lib/familia/features/external_identifier.rb', line 158 def persistent? true end |