2016-12-25 6 views
0

Недавно я создал миграцию рельсов, чтобы добавить имя пользователя в мое приложение.Что действительно делает «null: false»?

add_column :users, :username, :string 

Я создал тестовую учетную запись и зарегистрировался без ввода имени пользователя. Регистрация прошла и создала пользователя без имени пользователя. Я должен был исправить это, так как мне нужно имя пользователя, чтобы установить URL-адрес профиля. Так что я обновил свою миграцию:

add_column :users, :username, :string, null: false 

Я думал, что это будет препятствовать пользователю создать учетную запись с пустым именем - не работает! Я все еще собирался зарегистрироваться без имени пользователя.

В конце концов, добавив ...

 validates_presence_of :username 

... к моей user.rb модели исправили проблему. Но почему не null: false остановить его? Почему я должен хранить его и как он работает?

ответ

1

Это утверждение:

add_column :users, :username, :string, null: false 

переводит точно стандарту SQL DDL (Data Definition Language):

ALTER TABLE users ADD username VARCHAR(255) NOT NULL; 

Задний NOT NULL является эффект null: false. Вы можете использовать другие column modifiers, некоторые из которых переведены непосредственно в DDL.

Помните, что если вы уже применили миграцию к базе данных, дальнейшие изменения должны быть выполнены с помощью нового файла миграции. Обновления миграции Файлы Ruby не распространяются на схему базы данных, когда миграция уже была применена. В конце концов вы можете откатить последние миграции и повторно запустить их, но затем вы можете потерять существующие данные во время отката схемы. См. Changing Existing Migrations

+0

, так что не должен ли он получить сбой базы данных при вставке строки, где username = null? –

+0

Вы не можете просто обновить уже примененный файл миграции и ожидать, что DB будет синхронизироваться. Вам нужно отменить миграцию и снова применить или создать новую, которая изменяет ограничение. Просто проверьте схему базы данных, если '' NOT NULL' присутствует в 'username'. См. Здесь: http://guides.rubyonrails.org/active_record_migrations.html#changing-existing-migrations – gertas

Смежные вопросы