【问题标题】:Ruby on Rails: Skipping 'validate_on_create' statement for seedsRuby on Rails:跳过种子的“validate_on_create”语句
【发布时间】:2011-02-20 05:43:29
【问题描述】:

我的一个控制器中有一个“validate_on_create”语句,我希望跳过所有种子数据。有哪些解决方案可以使我的种子文件中的 create 语句跳过此验证。我当前的解决方案是在每次运行 rake db:seed 时注释掉验证。还有什么更聪明的吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您是否考虑在模型中添加一个在 validate_on_create 方法中检查的属性?

    例子:

    class MyModel < ActiveRecord::Base
    
      attr_accessor :skip_on_create_validation
    
      def validate_on_create
        unless skip_on_create_validation
          # do validation
        end
      end
    
    end
    
    # In db/seeds.rb
    MyModel.create(:skip_on_create_validation => true, ......)
    

    【讨论】:

    • Rails 4 是否有类似的功能?我认为validate_on_create 已被弃用,对吧?
    • 刚刚在另一个问题上找到了这个答案。使用一些正则表达式,可以定制他们的种子文件来完成这项工作。 stackoverflow.com/a/39064342/2326613
    【解决方案2】:

    您可以在保存对象时通过调用object.save(false) 显式跳过所有验证。

    例如:

    # In your model
    def validate_on_create
      # An example validation - replace with whatever you like
      return true unless name.blank?
    end
    
    # In db/seeds.rb
    # Create a new person
    p = Person.new(:name => 'Bob')
    # Save the record to the database, and *skip validation*
    p.save(false)
    

    【讨论】:

    • 我知道这一点,但我想将其用于:Model.create 而不是 Model.save(false)
    • 拨打object.create 时无法跳过验证。为什么不直接打电话给object.save(false)
    • 因为我正在创建很多这样的对象:models = Model.create([{ :name =&gt; "First name" }, { :name =&gt; "Second name" }])
    【解决方案3】:

    假设您没有通过固定装置加载它们,您可以通过调用 model.save(false) 来跳过验证。

    【讨论】:

    • 但是我在种子文件中使用了create函数。你是说我不这样做吗?
    • 所以不要使用 'create' 使用 'build' 功能
    • 它是 Rails 3,它是用于创建一个对象而不是多个
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 2015-05-08
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多