Rya*_*Lue 3 mysql validation null relational-database devise
我正在构建一个带有用于身份验证的 Devise 的 Rails 应用程序,它的默认数据库迁移设置以下列:
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
Run Code Online (Sandbox Code Playgroud)
设置null: false和default: ""同时的目的是什么?
我的理解是,null: false有效地使一个值成为必需:即,尝试NULL在该列中保存具有值的记录将在数据库级别失败,而不依赖于模型的任何验证。
但是然后default: ""基本上通过NULL在保存之前将值转换为空字符串来撤消。
我知道对于可选列,您希望拒绝NULL值只是为了确保该列中的所有数据都属于同一类型。但是,在这种情况下,电子邮件和密码绝对不是用户身份验证模型上的可选属性。我确定模型中有验证以确保您无法创建电子邮件地址为空的用户,但是您为什么要default: ""在这里设置呢?它是否提供了一些好处或防止了一些我没有考虑过的边缘情况?
null: false。无论您是创建新表还是更新现有表,都是如此。NULL在每一行中填充该新列。在这种情况下,您必须使用 覆盖此行为default: "",否则它将与 发生冲突null: false并且迁移将失败。Devise 使用两个单独的模板来构建迁移:migration.rb,用于创建新表,以及migration_existing.rb,用于更新现有表(请参阅GitHub 上的源代码)。两个模板都调用相同的migration_data方法来生成有问题的行(即指定的行null: false, default: ""),但如上所述,default: ""仅在后一种情况下才真正相关(有关更多信息,请参阅O. Jones 的回答)。
所以对你的问题的简短回答,特别是在设计迁移的情况下,是“因为生成器使用了借用的代码,这些代码并不总是适用,但仍然没有破坏任何东西。”
UNIQUE列的注意事项:请注意,在大多数流行的 SQL 引擎中,唯一索引的列仍然可以包含多行NULL值,只要它们不是必需的(自然)。但是使新列既是必需的又是唯一的(即, null: false , default: "", 和unique: true)的效果是它不能被添加:数据库引擎试图在每一行中用一个空字符串填充新列,这与unique约束冲突并导致迁移失败。
(此机制失败的唯一情况是如果您的表中只有一行 - 它为新列获取一个空字符串值,这自然会通过唯一性约束,因为它是唯一的记录。)
因此,另一种看待它的方式可能是这些选项是一种安全机制,可防止您运行不应该运行的迁移(即,追溯地将所需的列添加到已填充的表中)。
| 归档时间: |
|
| 查看次数: |
1984 次 |
| 最近记录: |