Rails:模型与迁移中的validation

可能重复:
Ruby on Rails:在模型或数据库中validation是否更好?

我看到可以在Rails模型和迁移中添加相同的约束/validation。 但哪一个是最好的方法? 在模型和数据库级别(以及为什么)进行validation是一种好的做法吗? 或者它们在轨道上相同?

例如,我们可以在模型和迁移中对名称进行相同的validation

class User  true, :presence => true end class CreateUser  true, :null => false end end end 

尽可能在数据库级别和模型级别进行validation。

为什么? 对于初学者,活动记录不会在所有上下文中强制执行validation。 以下方法跳过validation,并将对象保存到数据库,无论其有效性如何:

 decrement! decrement_counter increment! increment_counter toggle! touch update_all update_attribute update_column update_counters 

如果您传递:validate => false进行save ,它也将跳过validation。 有关详细信息,请参阅“跳过validation”的“ 活动记录validation和回调指南”部分。 (如果这让你担心,甚至有一个gem可以禁用这些方法。)

因此, #1的理由是Railsvalidation无论如何都不是完全certificate:完全依赖它们是有风险的,特别是对于任务关键validation,例如唯一性。

说到这一点, 理由#2 (在我的头脑中):activerecordvalidation容易出现竞争条件,而Rails的唯一性validation器尤其不能保证唯一性 。 这是许多文件中的一篇文章 ,为什么会这样。

虽然它们可能很少发生,但违反唯一性约束可能会破坏整个数据集。 在极少数情况下Rails即将执行此操作,您需要不惜一切代价来阻止它,这是数据库唯一性约束的用武之地:数据库是为处理这种情况而构建的,并且将始终如一地强制执行唯一性,即使Rails没有。

原因#3 :为什么不在模型和DB中validation? 当然,你复制了一下,但是如果Rails错过了像唯一性validation检查这样的东西,那么与支付相比,这通常是一个非常小的问题。 这实际上不是一个或两个命题:在任何可能的地方重复validation总是更好,特别是对于任务关键约束,例如唯一性。

无论如何,那些是我的想法,希望有所帮助。

参考:执行正确性的地方 (由Gary Bernhardt进行截屏,需要订阅才能查看)