Rails 6自定义主键问题:id作为常规非空列时赋值异常
Rails 6 自定义主键与保留id列的问题解决
问题原因
Rails ActiveRecord 默认会将 id 属性与模型的主键列绑定,即便你通过 self.primary_key 指定了其他主键(比如auto_id),它仍会把 id 方法作为主键的别名使用。所以当你执行 self.id = '9' 时,实际是在给 auto_id 赋值,而非数据库表中的 id 列,导致真正的 id 列始终为 NULL,触发数据库非空约束错误。
解决方案
1. 确认迁移文件正确性
你的迁移代码已满足需求,若需要更明确的声明,可修改为:
class InitialMigration < ActiveRecord::Migration[6.1] def change create_table :cars, id: false, force: true do |t| # 明确声明auto_id为自增主键 t.bigint :auto_id, null: false, auto_increment: true, primary_key: true t.string :id, null: false end end end
2. 修正Model代码
在Model中显式声明 id 为普通字符串列,避免Rails将其映射到主键:
class Car < ActiveRecord::Base self.primary_key = "auto_id" # 显式指定id为普通字符串属性 attribute :id, :string # 示例:在创建前赋值id before_create do self.id = "自定义ID值" # 替换为业务所需的唯一标识 end end
测试验证
执行以下代码验证效果:
car = Car.new car.id = "123456" car.save! # 查看结果 car.auto_id # 数据库自动生成的自增ID car.id # 输出 "123456",符合预期
内容的提问来源于stack exchange,提问作者Dariusz Mydlarz
相关产品推荐
相关产品推荐

