Rails 5.2升级至6.1后创建记录仅触发UPDATE事务问题求助
问题排查与解决方案
核心问题根因
该问题本质是Active Record错误将新实例判定为已持久化状态,所以执行UPDATE而非INSERT操作。你看到的UPDATE语句WHERE条件为id IS NULL,本身不会匹配到任何数据库记录,自然不会写入数据,也不会生成自增ID;而before_create回调仅在新记录创建流程触发,当前流程被判定为更新,所以不会执行。
排查步骤
- 首先在断点处执行以下代码验证状态判断是否异常:
@b.new_record? # 新实例预期返回true,如返回false则为状态判定错误 @b.persisted? # 新实例预期返回false,如返回true则为状态判定错误 - 检查对应模型代码,排查是否有自定义
persisted?、new_record?方法:Rails 6.1调整了内部持久化状态判断逻辑,旧版本中自定义的状态方法(例如软删除场景下重写persisted?时未调用super)会导致状态判定失效,需要修改为兼容写法,示例如下:# 旧写法(Rails 5.2可用,Rails 6.1不兼容) def persisted? id.present? && deleted_at.nil? end # 新兼容写法 def persisted? super && deleted_at.nil? end - 检查模型是否自定义了非自增主键,或者
schema.rb中对应表的主键配置被修改,导致主键为空时AR错误判定实例已持久化。 - 注释模型内所有第三方引入的模块、自定义回调,逐步排除是否是依赖gem版本升级后,扩展的AR逻辑与Rails 6.1不兼容导致的状态异常。
- 检查
config/initializers目录下是否存在Active Record全局扩展补丁,Rails大版本升级后旧补丁很容易出现逻辑冲突。
内容的提问来源于stack exchange,提问作者ykirloskar
相关产品推荐
相关产品推荐

