【问题标题】:Bypass validations during a data only migration to fix validation errors在仅数据迁移期间绕过验证以修复验证错误
【发布时间】:2011-02-11 00:01:46
【问题描述】:

在 Rails 中,我有迁移来更改生产数据以适应新的验证规则,有几处错误,所以我有 2 个不同的迁移(它们可能是一个,但仍然是两个单独运行的方面)一个失败,因为另一个验证不是遇到了,反之亦然

验证在模型中是新的,例如

 validates_uniqueness_of :job_id , :scope => [:day, :time, :user_id , :overtime, :comments] , :message => "Duplicate Entry, Please check your data"
 validates_uniqueness_of :job_id , :scope => [:day, :user_id, :comments] , :message => "Has 2 Entires for same job on same day with same comment"

是一种全新的 而另一个只是从 24 变为 8 并添加了超时位

  validates_numericality_of :time, :greater_than => 0, :less_than_or_equal_to => 8
  validates_numericality_of :overtime, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 16

我尝试重新排序迁移,但结果相反。

除了先更新数据库然后更新此文件以绕过它之外,还有其他方法吗? 还是我应该这样做?

【问题讨论】:

    标签: ruby-on-rails ruby validation rails-migrations


    【解决方案1】:

    在 Rails 2 中:

    object.save(false)
    

    在 Rails 3 和 4 中:

    object.save(:validate => false)
    

    这些方法将绕过对象的所有验证,所以要小心!

    【讨论】:

    • 我认为无论如何都可以让它绕过一些验证。只是检查
    • 这里使用哈希的区别很重要。第一个在 Rails 2 中不起作用。
    【解决方案2】:

    嘿,我知道这是一个老问题,已经回答了,但根据你的评论,我想我会留下两分钱。

    Rails 2 或 3 中无法打开或关闭单个验证。但是,我们在项目中广泛使用人口任务,因此我们有一个小的解决方法。

    如果您想对每一次验证都进行一次验证,这有点乏味,但通常您想要“关闭”一段时间的验证很少。

    class FooModel < ActiveRecord::Base
    
      validates_uniqueness_of :foo_name, :unless => :dont_check_foo_name
      attr_accessor :dont_check_foo_name
    
    end
    

    如果您遵循严格的命名约定,当您创建一个对象时,您可以简单地将适当的 dont_check_*validation_name* 设置为 true,它将绕过验证。

    另外,对于您的第二条评论,如下:

    object.save(false)
    object.save!(false)
    

    以同样的方式工作。

    当然,我提到的条件验证也适用于两者。

    【讨论】:

    • 嗯,很有趣。我不再从事任何需要的工作,但我喜欢这个想法。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2013-08-04
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多