Ruby on rails 当我需要模型关系时,我如何防止错误?

Ruby on rails 当我需要模型关系时,我如何防止错误?,ruby-on-rails,ruby,model,Ruby On Rails,Ruby,Model,我有一个应用程序,它有许多相互依赖的数据库关系,可以成功地运行该应用程序。应用程序中的枢纽是一个称为日程的模型,但日程将拉动区块、员工、职务和工作分配(除此之外,每个区块也将从数据库中拉动一个工作分配),以在一天中汇总员工日程 当我构建应用程序时,我非常强调验证,以确保在将所有内容保存到数据库之前,所有内容都必须到位。到目前为止,这个应用程序已经运行了将近6个月,每个月可以处理大约150000个请求,没有任何问题或错误。直到上周 上周,当有人更改计划时,看起来数据库出错了,计划保存到数据库中,但

我有一个应用程序,它有许多相互依赖的数据库关系,可以成功地运行该应用程序。应用程序中的枢纽是一个称为日程的模型,但日程将拉动区块、员工、职务和工作分配(除此之外,每个区块也将从数据库中拉动一个工作分配),以在一天中汇总员工日程

当我构建应用程序时,我非常强调验证,以确保在将所有内容保存到数据库之前,所有内容都必须到位。到目前为止,这个应用程序已经运行了将近6个月,每个月可以处理大约150000个请求,没有任何问题或错误。直到上周

上周,当有人更改计划时,看起来数据库出错了,计划保存到数据库中,但缺少分配。因为关联在每个视图中都会被调用,所以每当从数据库调用此计划时,应用程序都会因为调用nil而抛出NoMethod错误

当以我所说的方式设计应用程序时,您是否会防范数据库/验证部分可能出现的故障?如果是这样的话,你如何在程序上防范它?在将关系发送到视图之前,是否检查每个关系以确保它不是零

我知道这个问题有很多概括性,如果我能更具体地说明我的意思,请在评论中告诉我。

我建议添加和

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

我建议添加和


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

如果要让应用程序正常运行,它必须是真的,那么这就是
assert()
s的真正用途。我几乎从未使用过Ruby,但我想它一定有这个概念。使用它们在代码中的不同位置强制执行前提条件。与消毒和验证外部(用户)输入相结合应该足以保护您。我认为,如果在进行了大量的检查后出现问题,你的应用程序理所当然地会崩溃(当然是以可控的方式)


我怀疑您遇到的问题是数据库中的错误。更有可能的是,在您的验证中,您忽略了一些边缘情况。

如果要使应用程序正常运行,它必须是正确的,那么这就是
assert()
的真正用途。我几乎从未使用过Ruby,但我想它一定有这个概念。使用它们在代码中的不同位置强制执行前提条件。与消毒和验证外部(用户)输入相结合应该足以保护您。我认为,如果在进行了大量的检查后出现问题,你的应用程序理所当然地会崩溃(当然是以可控的方式)


我怀疑您遇到的问题是数据库中的错误。更有可能的是,您忽略了验证中的某些边缘情况。

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

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


这样,不管您有什么保护措施,如果坏数据确实进入,您很快就会知道它。

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

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


这样,不管你有什么保护措施,如果坏数据真的进来了,你迟早会知道的。

我将论证这方面的非传统智慧。您描述的约束不属于数据库,它们属于您的OO代码。“数据库出错”并不是真的,毫无疑问,应用程序插入了未正确验证的数据

当您开始期望数据库承担这些检查的负担时,您正在将业务规则放入模式中。至少,这会使编写单元测试变得更加困难(这是您应该首先抓住的地方;但现在是添加另一个测试的机会)

理想情况下,您应该能够使用其他一些通用数据存储来替换RDBMS,并且在适当的其他位置仍然保持所有功能逻辑的正常活动和不变。UI不应该与DAL对话,更不应该直接处理数据库异常

如果需要,可以添加额外的数据库约束,但严格来说,它应该作为备份。如您所见,优雅地处理数据库结构错误(特别是涉及到UI时)要困难得多。

我将