Rails活动记录验证 - 我应该验证非用户生成的数据

时间:2016-01-18 17:08:04

标签: ruby-on-rails ruby-on-rails-4 activerecord

我不确定我是否理解完全活跃的记录验证角色。

当然,如果用户输入数据(如电子邮件或国家/地区),我可以而且应该验证其存在,其唯一性或将其包含在国家/地区列表中

但是,例如,如果我在后端有方法更改属性page_clicked或click_date甚至列update_at,我“控制”即“不是由用户的输入生成”,我应该使用活动记录验证吗?

我问这个是因为在一个非常'热门的数据库'上(需要数百万次频繁更新的速度),我想知道是否检查每个更新,即updated_at是一个日期时间,如果点击的列是真/假,没有esle是真的有必要,因为用户不是输入/控制这些数据的人,但我通过我写的Rails自定义方法

由于

3 个答案:

答案 0 :(得分:3)

我认为你的问题没有一个令人满意的答案。是否由您来强制执行验证。

请记住,不必使用ActiveRecord进行验证,您也可以使用DBMS来确保:

  • 一个值永远不会为NULL(最烦人的错误之一)
  • 值具有正确的TYPE
  • FOREIGN KEY始终指向另一个表中的现有行
  • 并且取决于您的DBMS,还有更多可能

如果您需要高INSERT速度并希望使用原始SQL INSERTS,那么在数据库中进行一些验证可以防止以后出现令人讨厌的应用程序错误。

答案 1 :(得分:1)

验证应保护您的数据库,其工作应该是停止保存您的应用程序认为无效的记录。

对于什么是有效记录,您必须通过添加验证来确定自己。如果记录不通过验证步骤,则根本不会将其保存到数据库中。

来自Active Record Callbacks

3.1 Creating an Object
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback

3.2 Updating an Object
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback

您可以看到验证挂钩在对象生命周期的开始处运行。

所以在你的情况下,而不是问自己一个问题:

如果记录不是由用户输入生成的,我是否应该使用有效记录验证。

你应该问问自己:

如果没有page_clicked或click_date(也称为零),此记录是否无效

<强>更新

如果您认为记录无效但担心运行验证的速度问题,我会进行验证以确保数据库中的所有记录都有效并尝试找到优化其他地方速度的方法。另外,不是百分之百确定,但是保存无效记录的时间花费以及稍后过滤它们的时间可能比首先验证的时间长得多。

答案 2 :(得分:0)

当性能确实是一个优先事项并且我确信我们的开发人员/服务器是唯一可以操作模型的特定属性的人时,我会

  1. 确保为此特定操作创建单独的方法/包装器方法。

  2. 在这种具体方法中,我致电.save (validate: false)而不是通常的.save

  3. 我仍然为开发人员编写上述属性的验证。参考以防止未来的开发错误,以及新开发人员进入并意外保存无效记录,正是因为没有验证来保护它。

  4. 或者,我将使用.update_column而不是.save (validate: false)来执行直接数据库调用,跳过模型验证和回调(如果您也不希望调用回调)。

  5. 请注意,.update_column.update不同。