如何在Rails中跳过before_validations?

时间:2017-02-02 20:33:41

标签: ruby-on-rails activerecord

我的代码可以更新/修复我的before_validation回调中的某些模型数据。

但是,我希望能够仍然运行验证以查看模型是否正常。

更具体地说,我想知道数据库中的记录是否有效。因此,我希望能够加载一个值,并在不运行会影响答案的回调的情况下询问.valid?

所以,我试过这个(以及一些变化),但它没有工作:

skip_callback :validation, :before, unless: ->{self.changed?}

skip_callback的文档很差,所以我不确定我是否正确使用它。这可以起作用吗?

感谢。

3 个答案:

答案 0 :(得分:2)

根据example skip_callback取callback_name,然后*filter_lists作为参数(然后是块)。

filter_list必须包含您的回调方法名称。如下所示。

class User < ActiveRecord::Base
  validates_presence_of :name
  before_validation :set_name

  skip_callback :validation, :before, :set_name, unless: -> { self.changed? }

  def set_name
    self.name ||= 'foobar'
  end
end

#<User:0x007ffcd7165248 id: 2, name: nil, created_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00, updated_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00>

User.find(2).valid? # returns false

user = User.find(2)
user.updated_at = Time.now
user.valid? # returns true, because it invokes :set_name before validation

答案 1 :(得分:1)

您可以跳过任何回调。您必须跳过回调并执行事务,然后再次设置回叫。 Model.skip_callback(:callback_name, :callback_position, :callback_action_name)

例如。

class ModelName < ApplicationRecord 
    before_validation :validation_action
    
    def validation_action
    end 

end 

在调用ModelName时跳过此验证

ModelName.skip_validation(:validation, :before, :validation_action)
ModelName.create!()
ModelName.set_validation(:validation, :before, :validation_action)

类似地,您可以跳过here

中的所有回调

答案 2 :(得分:0)

  

..我希望能够..问.valid吗?而没有运行我的回调会影响答案。

attr_accessor为条件进行验证。

# banana.rb
attr_accessor :use_validation_callbacks
before_validation :derp, if: { |b| b.use_validation_callbacks }
def initialize(*)
  self.use_validation_callbacks = true
  super
end

# elsewhere
banana = Banana.new
banana.use_validation_callbacks = false
banana.valid?