我最近创建了一个Rails迁移,以在我的设计用户中添加用户名。
add_column :users, :username, :string
我创建了一个测试帐户并注册而没有输入用户名。注册通过了没有用户名的用户。我必须解决此问题,因为我需要一个用户名来设置配置文件URL。因此,我将迁移更新为:
add_column :users, :username, :string, null: false
我认为这将阻止用户使用空名称创建帐户 - 无效!我仍然要注册没有用户名。
最终添加...
validates_presence_of :username
...向我的用户.RB模型解决了问题。但是,为什么没有null:false停止它呢?我为什么要保留它,如何工作?
此语句:
add_column :users, :username, :string, null: false
准确地转换为SQL DDL(数据定义语言)标准:
ALTER TABLE users ADD username VARCHAR(255) NOT NULL;
尾随NOT NULL
是null: false
的效果。您可以使用其他列修饰符将其中一些直接转换为DDL。
请记住,如果您已经将迁移应用于数据库,则应使用新的迁移文件进行更多修改。迁移Ruby文件的更新在已经应用迁移时不会传播到数据库架构。最终,您可以回滚最后的迁移并重新运行它们,但是随后您可以在模式回滚过程中丢失现有数据。请参阅更改现有迁移