Use ActiveModel::Attributes in Aws::Record
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia tracciando le macro degli attributi di Aws::Record’s BaseModel e i componenti ModelAttributes e ItemData menzionati nel problema. Esamina come interagiscono attualmente i campi persistiti, i metadati DynamoDB, i decorator, i valori predefiniti e il rilevamento delle modifiche. Il lavoro è completato quando i decorator di ActiveModel possono osservare ogni campo persistito senza compromettere il mapping e il comportamento di persistenza DynamoDB esistenti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the feature
Rework Aws::Record’s attribute layer so every attribute is registered through ActiveModel::Attributes. Under this approach, string_attr, integer_attr, etc. would become thin wrappers around attribute(name, type, default:), allowing decorators like ActiveModel::Attributes::Normalization#normalizes to hook into Aws::Record models.
Beyond normalization, this change would:
- Enable all current and future ActiveModel decorators (encryption, serialization helpers, etc.) on Aws::Record fields.
- Improve compatibility with form builders and other ActiveModel-based tools because casting, defaults, and dirty tracking come from the canonical Rails implementation.
- Reduce custom infrastructure—bug fixes and improvements in ActiveModel automatically flow to Aws::Record users instead of maintaining a parallel attribute system.
- Provide cleaner extension points: developers can register custom ActiveModel::Types or third-party decorators without fighting the DynamoDB marshaler layer.
- Simplify the codebase by letting ActiveModel::AttributeSet/ActiveModel::Dirty handle state tracking, trimming down ModelAttributes and ItemData.
Use Case
We attempted to use the new normalizes macro in our case for email addresses in an Aws::Record-backed app:
class Contact
include ActiveModel::Model
include ActiveModel::Attributes
include Aws::Record
include ActiveModel::Attributes::Normalization
string_attr :email
normalizes :email, with: -> value { value&.strip&.downcase }
end
That doesnt work.
Because every persisted field in BaseModel is declared with the Aws::Record macros (string_attr, integer_attr, etc.), the ActiveModel decorator hooks never see read/write operations, so normalization callbacks don’t fire. To make normalizes effective we’d have to redefine every attribute twice (attribute :foo for ActiveModel, plus string_attr :foo for Aws::Record) or build a bridge layer that makes Aws::Record emit the decorators ActiveModel expects. Both approaches would be fragile and risk the DynamoDB mapping getting out of sync. In short: adding include ActiveModel::Attributes to BaseModel won’t crash immediately, but it also doesn’t give us working normalization for the attributes we actually persist.
So we must maintain custom concerns instead of relying on the Rails-provided API.
Proposed Solution
Integrate ActiveModel::Attributes into Aws::Record’s core:
- Mix ActiveModel::Attributes into Aws::Record.
- Update attribute macros to call attribute(name, type, default:), wrapping existing DynamoDB marshalers in ActiveModel::Type subclasses.
- Preserve Dynamo-specific metadata (hash/range keys, GSIs, custom storage names) in side tables so persistence logic remains intact.
- Allow decorate_attributes to run on every field, unlocking normalization and other decorators.
- Refactor ModelAttributes/ItemData to lean on ActiveModel::AttributeSet and ActiveModel::Dirty for defaults and mutation tracking.
Prototype sketch:
class DynamoStringType < ActiveModel::Type::String
def serialize(value)
Aws::Record::Marshalers::StringMarshaler.new.serialize(value)
end
end
def string_attr(name, default: nil, **opts)
register_dynamo_metadata(name, opts)
attribute(name, DynamoStringType.new, default: default)
end
Other Information
No response
Acknowledgements
- I may be able to implement this feature request
- This feature might incur a breaking change
aws-sdk-ruby-record version used
latest
Environment details (OS name and version, etc.)
mac
- Lingua principale
- Ruby
- Stelle
- 318
- Fork
- 44
- Merge medio
- 2g 21h
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di aws/aws-record-ruby
-
BuildableSearch#complete!.to_a auto-paginates silently and Limit is per-page (companion to #153)Apertafeature-request
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
aws/aws-record-ruby#157 · 2 commenti ·
-
feature-request
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
aws/aws-record-ruby#155 · 1 commento ·
-
feature-request p2 queued
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
aws/aws-record-ruby#153 · 2 commenti ·
-
feature-request
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
aws/aws-record-ruby#147 · 1 commento ·
-
feature-request
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
aws/aws-record-ruby#142 · 6 commenti ·
Tutte le issue di aws/aws-record-ruby
Issue simili
-
documentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
bridgetownrb/bridgetown#1130 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
stripe/stripe-ruby#1994 ·
I maintainer di solito rispondono entro 1 giorno
-
[Fehler]: /abdeckstift wirft 500 — part_type aus der Phonemreduction-Umbenennung nicht mitgezogenApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
wort-schule/wort.schule#787 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
lugassawan/swe-workbench#799 ·
I maintainer di solito rispondono entro 1 giorno
-
2.8.6: NoMethodError "undefined method 'first'" in profdata_coverage_dir whenever --scheme is usedAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
SlatherOrg/slather#586 · 2 commenti ·