Является ли «Архив» зарезервированным словом в Rails или SQLite3? - PullRequest
0 голосов
/ 02 апреля 2019

После переноса модели с именем «Архив» все тесты завершаются с ошибкой ActiveRecord / сообщением об ошибке в соответствии с:

ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: archives.created_at: INSERT INTO "archives" ("some_thing") VALUES ('MyString')

Это было изолировано в новом приложении Rails на новой виртуальной машине, на которой запущена новаяустановите Ubuntu 18.04.2 с Ruby 2.6.1 и Rails 5.2.3, следуя инструкциям по установке проекта Odin.Проблема возникает только во время тестов для моделей с именем «Архив», а удаление атрибутов модели просто меняет ошибку на:

ActiveRecord::StatementInvalid: SQLite3::SQLException: incomplete input: INSERT INTO "archives"

Мой рабочий процесс выглядит следующим образом:

rails new sample_app

cd sample_app

(измените sqlite3 в Gemfile, чтобы использовать версию '~> 1.3.6' для исправления ошибки во время написания этой статьи)

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
rails db:test

Запускает этот тест: (без комментариев)

require 'test_helper'

class ArchiveTest < ActiveSupport::TestCase
  test "the truth" do
    assert true
  end
end

После запуска теста, который обычно представляет собой заданный проход, Rails возвращает первое сообщение об ошибке ActiveRecordвышеперечисленное.Я чувствую, что мне здесь чего-то не хватает, что мешает мне использовать слово «Архив» для модели.

1 Ответ

0 голосов
/ 03 апреля 2019

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 и updated_at там.

как:

one:
  ....some fields....
  created_at: 2018-08-30 14:41:23
  updated_at: 2018-08-30 14:41:23

UPDATE

Теперь вторая проблема в том, что у вас нет другого поля, кроме timestamp. Удалите эту таблицу и создайте новую модель для Архива, по крайней мере, с 1 полем. В настоящее время Rails генерирует запрос INSERT INTO "Archives";, и SQL ожидает данные после этого запроса, поэтому он возвращает вам ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...