Ruby on Rails: ActiveRecord::NotNullViolation: SQLite3::Cons



我正在尝试在我的应用程序上运行单元测试,我最初的错误是"表 xx 没有名为 yy 的列",所以在我的 yml 文件中我将字段更改为 id。但是,现在它给了我这个错误:

汽车控制器测试#test_should_destroy_car: ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL 约束失败 如何解决此问题并运行测试?

create_table "cars_parts", force: :cascade do |t|
t.integer "car_id"
t.integer "part_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["car_id"], name: "index_cars_parts_on_car_id"
t.index ["part_id"], name: "index_cars_parts_on_part_id"
end

您对cars_parts中的created_at有一个非空约束。

在错误中,您可以看到它说created_at不能为 Null:

SQLite3::ConstraintException: NOT NULL constraint failed: cars_parts.created_at

因此,在您的 yml 文件中,您需要设置created_at:

one:
car_id: 1
part_id: 1
created_at: Time.current
updated_at: Time.current
two:
car_id: 2
part_id: 2
created_at: Time.current
updated_at: Time.current

编辑:

正如塞巴斯蒂安指出的那样,这不是一个理想的解决方案,AR应该自动添加这些时间戳。

真正的问题是你把模型命名CarParts所以它找不到模型。 应将文件重命名为cars_part.rb,并将模型名称重命名为CarsPart

遇到此问题的其他人将原因归因于未找到模型:

https://github.com/rails/rails/issues/23316

使用 has_and_belongs_to_many 时,联接表不应创建/updated_at时间戳,并且不需要 CarsParts 模型(只需要表,不需要模型(。如果你想要一个 CarsParts 模型,你必须使用 has_many 和 has_many :through 关联,以便 ActiveRecord 将联接模型作为实际模型处理并设置时间戳

因此,您必须选择:

1-删除连接表上的时间戳并删除CarsParts模型

2-添加正确的关联并修复模型的表和名称:

CarPart #not CarsParts
belongs_to :car
belongs_to :part
self.table_name = 'cars_parts' # the actual plural would be car_parts, not cars_parts
Part
has_many :car_parts
has_many :cars, through: :cars_parts
Car
has_many :car_parts
has_many :parts, through: :cars_parts

最新更新