【问题标题】:Rails Active record validations - should I validate non-user generated dataRails Active 记录验证 - 我应该验证非用户生成的数据吗
【发布时间】:2016-01-18 17:08:03
【问题描述】:

我不确定我是否完全理解主动记录验证角色。

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    我认为您的问题没有一般令人满意的答案。是否强制验证由您决定。

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

    • 值永远不会为 NULL(最烦人的错误之一)
    • 值的类型正确
    • FOREIGN KEY 始终指向另一个表中的现有行
    • 根据您的 DBMS,还有更多可能

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

    【讨论】:

      【解决方案2】:

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

      对于什么是有效记录没有硬性规定,您必须通过添加验证自行决定。如果记录没有通过验证步骤,它就不会被保存到数据库中。

      来自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,这条记录是否无效(又名它们是 nil)

      更新

      如果您认为记录无效但担心运行验证的速度问题,我会进行验证以确保数据库中的所有记录都有效,并尝试找到在其他地方优化速度的方法。再加上不是 100% 肯定,但花在保存无效记录和稍后过滤它们上的时间可能会比最初验证要长得多。

      【讨论】:

      • 我问这个是因为在一个非常“热数据库”(需要数百万频繁更新的速度)上,我想知道是否检查每个更新,updated_at 是一个日期时间,如果一个点击的列是真/假,没有什么是真正必要的,因为用户不是输入/控制这些数据的人,但我是通过我编写的 Rails 自定义方法
      • 感谢“如果没有 page_clicked 或 click_date(又名它们是 nil),此记录是否无效”角度,非常令人不安。由于我的应用程序与游戏非常相似,因此在某些桌子上,我需要确保尽可能地没有人在作弊。这就是我验证很多的原因。所以如果castle_clicked_DATE不是真/假,则记录不是无效的,但可能是用户试图在他每天的每日拍摄次数上作弊.
      • 老实说,我认为验证没有任何问题 - 如果有什么东西使我的记录无效,我会坚持验证 - 我有很多验证记录,而且我从来没有任何明显的速度问题。只是你需要这个来验证它
      【解决方案3】:

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

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

      2. 在这个具体方法中,我调用.save (validate: false)而不是通常的.save

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

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

      请注意,.update_column.update 不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        相关资源
        最近更新 更多