Просмотр исходного кода

fix(model): 解决模型创建和更新时零值字段被默认值覆盖的问题

- 在创建记录前保存原始状态和同步官方字段值
- 使用独立的更新操作确保零值能够正确保存到数据库
- 修改更新方法使用 Select 强制更新所有字段包括零值
- 避免 GORM 默认行为对零值字段应用默认值导致数据丢失
wans10 1 месяц назад
Родитель
Сommit
3229b81149
1 измененных файлов с 19 добавлено и 13 удалено
  1. 19 13
      model/model_meta.go

+ 19 - 13
model/model_meta.go

@@ -47,7 +47,21 @@ func (mi *Model) Insert() error {
 	now := common.GetTimestamp()
 	mi.CreatedTime = now
 	mi.UpdatedTime = now
-	return DB.Create(mi).Error
+
+	// 保存原始值(因为 Create 后可能被 GORM 的 default 标签覆盖为 1)
+	originalStatus := mi.Status
+	originalSyncOfficial := mi.SyncOfficial
+
+	// 先创建记录(GORM 会对零值字段应用默认值)
+	if err := DB.Create(mi).Error; err != nil {
+		return err
+	}
+
+	// 使用保存的原始值进行更新,确保零值能正确保存
+	return DB.Model(&Model{}).Where("id = ?", mi.Id).Updates(map[string]interface{}{
+		"status":        originalStatus,
+		"sync_official": originalSyncOfficial,
+	}).Error
 }
 
 func IsModelNameDuplicated(id int, name string) (bool, error) {
@@ -61,18 +75,10 @@ func IsModelNameDuplicated(id int, name string) (bool, error) {
 
 func (mi *Model) Update() error {
 	mi.UpdatedTime = common.GetTimestamp()
-	return DB.Model(&Model{}).Where("id = ?", mi.Id).Updates(map[string]interface{}{
-		"model_name":    mi.ModelName,
-		"description":   mi.Description,
-		"icon":          mi.Icon,
-		"tags":          mi.Tags,
-		"vendor_id":     mi.VendorID,
-		"endpoints":     mi.Endpoints,
-		"status":        mi.Status,
-		"sync_official": mi.SyncOfficial,
-		"name_rule":     mi.NameRule,
-		"updated_time":  mi.UpdatedTime,
-	}).Error
+	// 使用 Select 强制更新所有字段,包括零值
+	return DB.Model(&Model{}).Where("id = ?", mi.Id).
+		Select("model_name", "description", "icon", "tags", "vendor_id", "endpoints", "status", "sync_official", "name_rule", "updated_time").
+		Updates(mi).Error
 }
 
 func (mi *Model) Delete() error {