Active Admin评论保存失败:UUID模型资源查询异常排查
问题原因与修复方案
核心原因
ActiveAdmin 默认生成的评论表(active_admin_comments)中,resource_id 字段类型为 整数,而你的 Bids 模型使用 UUID 作为主键(字符串格式)。两者类型不匹配,导致评论关联资源时无法正确匹配 UUID,最终出现查询 id = nil 并触发事务回滚的问题。
修复步骤
1. 生成/修改 ActiveAdmin 评论表迁移
如果尚未生成评论表迁移,先执行:
rails generate active_admin:comments
打开生成的迁移文件(位于 db/migrate/[timestamp]_create_active_admin_comments.rb),将 resource_id 的类型从 :integer 修改为 :uuid(或 :string,需指定足够长度):
create_table :active_admin_comments do |t| t.string :namespace t.text :body t.string :resource_type # 替换原有的 t.integer :resource_id t.uuid :resource_id, null: false t.references :author, polymorphic: true t.timestamps end add_index :active_admin_comments, [:namespace, :resource_type, :resource_id] add_index :active_admin_comments, [:author_type, :author_id]
如果选择用字符串类型,可改为:
t.string :resource_id, limit: 36, null: false
2. 执行迁移
rails db:migrate
3. 确保模型主键配置正确
在 Bid 模型中明确主键类型(虽然后台迁移已配置,但显式声明可避免潜在问题):
class Bid < ApplicationRecord self.primary_key = :id belongs_to :vendor, type: :uuid belongs_to :job, type: :uuid end
4. 重启 Rails 服务器
修改迁移和模型后,重启服务器使配置生效:
rails server
可选:更新 ActiveAdmin 版本
如果使用的 ActiveAdmin 版本较旧,可能存在对 Rails 7.1.0 或 UUID 支持不足的问题,可更新到最新稳定版:
bundle update activeadmin
验证
重新尝试在 ActiveAdmin 中给 Bid 资源添加评论,此时评论应能正确关联到 UUID 类型的 Bid 记录,不会再出现 id = nil 的查询错误和事务回滚。
内容的提问来源于stack exchange,提问作者Ben West
相关产品推荐
相关产品推荐

