Skip to content

Commit dbcf198

Browse files
committed
fix(model): 解决模型创建和更新时零值字段被默认值覆盖的问题
- 在创建记录前保存原始状态和同步官方字段值 - 使用独立的更新操作确保零值能够正确保存到数据库 - 修改更新方法使用 Select 强制更新所有字段包括零值 - 避免 GORM 默认行为对零值字段应用默认值导致数据丢失
1 parent 0c8db4f commit dbcf198

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

model/model_meta.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,21 @@ func (mi *Model) Insert() error {
4747
now := common.GetTimestamp()
4848
mi.CreatedTime = now
4949
mi.UpdatedTime = now
50-
return DB.Create(mi).Error
50+
51+
// 保存原始值(因为 Create 后可能被 GORM 的 default 标签覆盖为 1)
52+
originalStatus := mi.Status
53+
originalSyncOfficial := mi.SyncOfficial
54+
55+
// 先创建记录(GORM 会对零值字段应用默认值)
56+
if err := DB.Create(mi).Error; err != nil {
57+
return err
58+
}
59+
60+
// 使用保存的原始值进行更新,确保零值能正确保存
61+
return DB.Model(&Model{}).Where("id = ?", mi.Id).Updates(map[string]interface{}{
62+
"status": originalStatus,
63+
"sync_official": originalSyncOfficial,
64+
}).Error
5165
}
5266

5367
func IsModelNameDuplicated(id int, name string) (bool, error) {
@@ -61,18 +75,10 @@ func IsModelNameDuplicated(id int, name string) (bool, error) {
6175

6276
func (mi *Model) Update() error {
6377
mi.UpdatedTime = common.GetTimestamp()
64-
return DB.Model(&Model{}).Where("id = ?", mi.Id).Updates(map[string]interface{}{
65-
"model_name": mi.ModelName,
66-
"description": mi.Description,
67-
"icon": mi.Icon,
68-
"tags": mi.Tags,
69-
"vendor_id": mi.VendorID,
70-
"endpoints": mi.Endpoints,
71-
"status": mi.Status,
72-
"sync_official": mi.SyncOfficial,
73-
"name_rule": mi.NameRule,
74-
"updated_time": mi.UpdatedTime,
75-
}).Error
78+
// 使用 Select 强制更新所有字段,包括零值
79+
return DB.Model(&Model{}).Where("id = ?", mi.Id).
80+
Select("model_name", "description", "icon", "tags", "vendor_id", "endpoints", "status", "sync_official", "name_rule", "updated_time").
81+
Updates(mi).Error
7682
}
7783

7884
func (mi *Model) Delete() error {

0 commit comments

Comments
 (0)