数据库约束与验证之间的对应关系

从项目开发开始一段时间后,您可能会注意到数据库中的限制与应用程序中的验证之间存在不一致。 在本文中,我将说明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(例如续集)

自己尝试并分享您的反馈。 我将不胜感激!

Source: https://habr.com/ru/post/zh-CN431294/


All Articles