Как я могу перенести существующую модель (включая вставленные строки) из столбца, который можно обнулять, в не обнуляемый? - PullRequest
0 голосов
/ 27 октября 2018

Я создал модель с определением столбца

create_table :admin_authentication_tokens do |t|
    t.integer :authentication_ttl
end

А теперь я хочу, чтобы authentication_ttl не обнулялся. Я пробовал с этой миграцией

change_column :admin_authentication_tokens, :authentication_ttl, :integer, null: false, default: 0

но получил ошибку PG::NotNullViolation: ERROR: column "authentication_ttl" contains null values Я понимаю, что означает ошибка, но я не хочу переносить модель вручную. Поэтому, пожалуйста, дайте мне способ перенести модель с файлом миграции.

1 Ответ

0 голосов
/ 27 октября 2018

Нельзя добавить ограничение NOT NULL к столбцу, который содержит нулевые значения.

Так или иначе, вам нужно избавиться от этих значений перед выполнением такой миграции.

Например, как вы предложили выше, возможно, все они должны быть установлены на 0:

MyModel.where(authentication_ttl: nil).update_all(authentication_ttl: 0)

... Или, может быть, есть какое-то другое значение, которое (некоторые из) этих столбцов можно установить на?

Или, может быть, эти строки на самом деле не имеют смысла и должны быть удалены?

MyModel.where(authentication_ttl: nil).delete_all

(Или, возможно, вам следует destroy_all, чтобы вызвать обратные вызовы рельсов?)

Короче говоря, ответ действительно зависит от ваших конкретных обстоятельств. Но так или иначе, вам нужно сначала избавиться от null.

Обратите внимание, что если у вас есть производственная среда, а также локальная среда, то это необходимо учитывать перед развертыванием. Опять же, так или иначе (например, возможно, с помощью грабли), вам необходимо «исправить» производственные данные перед развертыванием такой миграции.

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