fix: 修复模型管理"参与官方同步"与"状态"开关无法保存的问题 - #2815
Conversation
- 将全局更新改为字段映射更新 - 移除不必要的会话配置选项 - 使用显式字段映射替代 Omit 和 Select 操作 - 提升代码可读性和维护性 - 保持数据一致性的同时提高性能
- 在创建记录前保存原始状态和同步官方字段值 - 使用独立的更新操作确保零值能够正确保存到数据库 - 修改更新方法使用 Select 强制更新所有字段包括零值 - 避免 GORM 默认行为对零值字段应用默认值导致数据丢失
WalkthroughThe Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
fix: 修复模型管理"参与官方同步"与"状态"开关无法保存的问题
问题描述
模型管理模块中,创建或编辑模型时,将"参与官方同步"或"状态"开关关闭后保存,刷新页面后开关仍显示为开启状态。
根本原因
1. Insert 方法问题
当使用
DB.Create(mi)创建模型时,GORM 会因为default:1标签将零值字段(status=0,sync_official=0)替换为默认值 1,并回写到结构体。后续的更新操作使用的是已被覆盖的值。2. Update 方法问题
原始代码使用
Updates(mi)更新模型,但 GORM 的Updates()方法默认忽略零值字段,导致status=0和sync_official=0不会被写入数据库。解决方案
Insert 方法
在调用
DB.Create()之前保存status和sync_official的原始值,创建后使用保存的原始值进行二次更新。Update 方法
使用 GORM 的
Select()方法显式指定要更新的字段,强制更新包括零值在内的所有字段。修改文件
Select()指定更新字段测试验证
Summary by CodeRabbit