Minitest会抛出ActiveRecord::NotNullViolation

编程语言 2026-07-12

以下错误
ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR: null value in column "user_id" of relation "promotion_covers" violates not-null constraint
在迁移和数据库指示的情况下,显得有些蹊跷:

    create_table :promotion_covers do |t|
      [...]
      t.references :user, null: true, foreign_key: true

并 /d+ promotion_covers显示:

    Column   | Type | Collation | Nullable | Default | Storage | Compression | 
-------------+------------------+----------+---------+---------+-------------+
user_id      | bigint |         | not null |         | plain   |             |

以及类

class PromotionCover < ApplicationRecord
  belongs_to :user, optional: true

user_id 列在迁移文件中从 null: false 改动,并在PostgreSQL中进行了手动编辑。

PG::NotNullViolation可能来自哪里?

解决方案

我的结论是,尽管Minitest会对fixture数据进行完整重新加载,但它仍然依赖于 schema.rb 文件。

因此:

  • 数据导出(开发环境)
  • bin/rails db:drop + db:create + db:migrate
  • 数据加载(开发环境)

是为了获得符合预期的验证所必需的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章