Module: TypedEAV::Versioned
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/typed_eav/versioned.rb
Overview
Mixin that opts a host entity into Phase 04 versioning AFTER it has already called ‘has_typed_eav`. Equivalent in effect to passing `versioned: true` directly to `has_typed_eav`, but useful for:
- Codebases that group versioning concerns separately from the
`has_typed_eav` macro (e.g., audited models in a `Auditable`
mixin pattern).
- Apps that conditionally include versioning via Rails initializers
based on environment (`include TypedEAV::Versioned if Rails.env.production?`).
## Usage
class Contact < ActiveRecord::Base
has_typed_eav scope_method: :tenant_id, types: %i[text integer]
include TypedEAV::Versioned
end
The order matters: ‘has_typed_eav` first, `include TypedEAV::Versioned` second. The concern’s ‘included` hook re-registers the entity with `versioned: true`, preserving the existing `types:` restriction by reading the current Registry entry. If `has_typed_eav` was not called first, the included hook raises ArgumentError with a clear message.
Why post-‘has_typed_eav` (not standalone): `has_typed_eav` sets up the `has_many :typed_values` association, defines `typed_eav_scope` / `typed_eav_parent_scope` accessors, and includes the InstanceMethods mixin. Without that infrastructure, Phase 04 versioning has nothing to version — the host model can’t even hold typed values. So ‘Versioned` is a post-step, not a replacement (Scout §2 confirmed this design).
## Equivalent to ‘has_typed_eav versioned: true`
The two forms produce identical Registry state:
has_typed_eav versioned: true
# OR
has_typed_eav
include TypedEAV::Versioned
The kwarg form is preferred for new code (one declaration, less to remember). The concern form is for codebases with established mixin-based feature wiring conventions.