迁移名为“ Archive”的模型后,所有测试均失败,并显示ActiveRecord /错误消息,如下所示:
ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: archives.created_at: INSERT INTO "archives" ("some_thing") VALUES ('MyString')
此操作隔离在新VM上的新Rails应用程序中按照Odin Project的安装说明,使用Ruby 2.6.1和Rails 5.2.3运行全新的Ubuntu 18.04.2安装。该问题仅在名为“ Archive”的模型的测试期间出现,并且删除模型的属性只会将错误更改为:
ActiveRecord::StatementInvalid: SQLite3::SQLException: incomplete input: INSERT INTO "archives"
我的工作流程如下:
{{2 }}(在撰写本文时,将Gemfile中的sqlite3更改为使用版本“〜> 1.3.6”来修复错误)
rails new sample_app
cd sample_app
生成此迁移:
{ {2}}bundle install
rails g model Archive
创建此架构:
class CreateArchives < ActiveRecord::Migration[5.2]
def change
create_table :archives do |t|
t.timestamps
end
end
end
rails db:migrate
运行此测试:(未注释)
ActiveRecord::Schema.define(version: 2019_04_03_003144) do
create_table "archives", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
< p>运行测试(通常是给定的测试)后,Rails返回上面列出的第一条ActiveRecord错误消息。
我觉得这里缺少一些东西,使我无法在模型中使用“存档”一词。
答案 0 :(得分:0)
Archive
不是保留字。您提供的链接在过去5年中没有更新。
其背后的原因是:
您正在创建存档记录,但未提供created_at
中的必填字段updated_at
和schema
。
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
解决方案:
要么更改您的迁移,以允许将null
和created_at
插入updated_at
,要么请您test/fixtures/archive.yml
并提供created_at
和{{1} }。
喜欢:
updated_at
更新
第二个问题是因为您除了one:
....some fields....
created_at: 2018-08-30 14:41:23
updated_at: 2018-08-30 14:41:23
之外没有其他任何字段。删除该表并使用至少1个字段为Archive创建新模型。当前,Rails正在生成查询timestamp
,SQL在此查询后需要数据,这就是它向您返回错误的原因。