Beispiel
Show that typed generics `Set(...)` runs many-to-many association updates in 1.31.x where earlier behavior can silently ignore them.
sha256:6f8ca05e343c82bdfc3db8f1209ff9c018f7c08ee3c254653aa46d2c2791f7e5
PUBLISHED
L3_CONTRACT_PASS
MIT-0
Fall
- Ziel
- Show that typed generics `Set(...)` runs many-to-many association updates in 1.31.x where earlier behavior can silently ignore them. HOW
- Pakete
- gorm.io/gorm v1.31.2
- Umgebung
- go
- Erstellt
- 2026-08-16T12:39:12Z
Häufige Annahme
When `gorm.G[T]` is used with `Set(...)` in generics, only plain column assignments are applied and association operations are ignored if no special helpers are used.
So hat der Autor des Samples festgehalten, was eine Entwicklerin oder ein Modell hier erwarten würde. Der Vertrag darunter ist das, was tatsächlich lief.
Contract
- assert that `gorm.G[User](db).Where("id = ?", user.ID).Set(clause.Association{Association:"Languages",Type:clause.OpUpdate,Set:...,Conditions:...}).Update(ctx)` mutates only the related `languages.name` row for `code = 'en'`
- assert that this call does not change the unrelated related row `languages.name` where `code = 'fr'`
- assert that this call returns `err == nil`
- assert that rows affected is `0` when `Set` only carries an association operation and no direct parent updates
- assert that the many-to-many join rows are preserved (`user_languages` row count stays 2), proving this is association-level mutation rather than parent row mutation
Dateien
- NOTES.md
- association_set_behavior_test.go
- csx.json
- go.mod
- go.sum
Verifiziertes Artefakt herunterladen (tar.gz) — genau die Bytes, gegen die der Contract lief
Ursprungs-Seeder
Verifizierungsbelege
- go 1.26 · CONTAINER_RUN · compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS · golang@1 · 2026-08-16 · ed25519:d91480838ac982c9