从项目开发开始一段时间后,您可能会注意到数据库中的限制与应用程序中的验证之间存在不一致。 在本文中,我将说明gem
database_consistency如何帮助您整理数据库。
我们讨论了两种可能的情况。 为
ActiveRecord编写的示例代码。
第一种情况
假设您有一个显示如下的表:
create_table :users do |t| t.string :name end
并声明为:
class User < ApplicationRecord validates :name, presence: true end
在这种情况下,可以使用诸如
save(validate: false)
类的方法来忽略
save(validate: false)
,结果,
NULL值将存储在数据库中。 在
大多数情况下,您不希望发生这种情况(因为已安装验证)。 因此,在数据库中具有非零限制会更正确。
create_table :users do |t| t.string :name, null: false end
第二种情况(反向)
假设您有一个显示如下的表:
create_table :users do |t| t.string :name, null: false end
并声明为:
class User < ApplicationRecord validates :name end
在这种情况下
valid?
对于无法保存的记录将返回
true
。 此外,尝试将这样的记录保存在数据库中将执行一个到几个SQL查询,最终将返回错误,同时回滚整个事务。 所有这些操作效率低下,可以通过添加
presence: true
来轻松解决
presence: true
验证。 在大多数情况下,您应该添加此验证。
我想到了一个问题:如何自动找到所有此类案件?
我向您展示我的gem
database_consistency 。 目前,它可以检测到大多数情况。 作为一个小小的奖励,他还将告诉您一种情况,可以将具有
NULL值的记录保存在具有非零限制的列中。
一些问题仍然存在:
- 还有什么其他实施机会?
- 是否需要支持其他ORM(例如续集) ?
自己尝试并分享您的反馈。 我将不胜感激!