当我需要模型关系时,如何防范错误?

Bus*_*ark 1 ruby model ruby-on-rails

我有一个具有大量数据库关系的应用程序,它们相互依赖以成功运行应用程序.应用程序中的铰链是一个名为Schedule的模型,但是计划将拉出Blocks,Employee,JobTitle和Assignment(除此之外,每个Block也会从数据库中提取一个赋值)到全天组织员工日程安排.

当我构建应用程序时,我非常强调验证,以确保在将所有内容保存到数据库之前所有部分都必须到位.到目前为止,这已经非常出色,应用程序已经上线了近6个月,每月提供大约150,000个请求,没有打嗝或错误.直到上周.

上周,当某人正在改变计划时,看起来数据库出错了,并且计划保存到数据库时,其分配缺失.因为在每个视图中都调用了关联,所以无论何时从数据库调用此调度,应用程序都会在调用nil时抛出NoMethod错误.

在按照我声明的方式设计应用程序时,您是否防止数据库/验证可能出现故障?如果是这样,你如何编程防御呢?在将其发送到视图之前,您是否检查了每个关系以确保它不是nil?

我知道这个问题很普遍,如果我的意思更具体,请在评论中告诉我.

Joh*_*hat 5

我建议添加数据库强制的外键约束并将重要的操作组包装到事务中.

如果某个地方的Schedule和Assignment之间存在外键,则数据库强制的外键约束将阻止错误插入.此外,如果将特定操作包装在事务中,则可以确保整个插入/更新/删除流发生或失败,恢复到干净状态.


Sar*_*Mei 5

除了您的验证,并添加其他答案中提到的一些数据库约束,您还可以运行后台作业,定期扫描数据库以查找孤立.

当它找到一个时,它会清理它(如果可能的话),或删除它,或者只是将它标记为非活动状态并向您发送电子邮件,以便您以后查看它.根据数据的数量和性质,每分钟一次,每小时一次,每天一次......

这样一来,如果不管你有什么安全措施,不良数据确实进入,你很快就会知道它.