使用paper_trail gem跟踪主键为UUID的模型时出现报错如何解决?
PaperTrail 跟踪UUID主键模型的解决方案
首先明确:PaperTrail完全支持跟踪主键为UUID的模型,你遇到的报错是配置和迁移操作顺序有误导致的。
报错原因
你先创建了默认的PaperTrail版本表,默认配置下versions表的item_id是整型,所以UUID主键会被强制转成整型存入,最终变成0。后续你直接把item_id列改成UUID类型时,表中已经存在的旧记录里item_id = 0不符合UUID格式,就触发了PostgreSQL的类型校验报错。
正确操作步骤
- 如果你还没产生有效版本数据,直接删除旧的versions表,重新生成适配UUID的迁移文件即可:
- 生成PaperTrail迁移时指定item_id类型为uuid
- 执行迁移前在迁移文件中把
t.bigint :item_id改成t.uuid :item_id - 模型中开启PaperTrail时无需额外特殊配置,正常使用
has_paper_trail即可
- 如果你需要保留已有版本数据,操作顺序如下:
- 先给versions表新增一个临时uuid类型字段,把原有合法的item_id转成uuid存入,清理掉item_id=0的无效旧记录
- 删除原item_id字段,把临时字段重命名为item_id
- 新增配置
PaperTrail.config.item_id_type = :uuid到PaperTrail初始化文件中
验证配置
修改完成后新增模型数据,查看versions表的item_id会正常存入对应UUID值,不会再出现类型转换错误。
内容的提问来源于stack exchange,提问作者wout
相关产品推荐
相关产品推荐

