class ActiveRecord::Import::Validator
def initialize(validators, options = {})
def initialize(validators, options = {}) @validators = validators @options = options end
def valid_model?(model)
def valid_model?(model) validation_context = @options[:validate_with_context] validation_context ||= (model.new_record? ? :create : :update) current_context = model.send(:validation_context) model.send(:validation_context=, validation_context) model.errors.clear validation_proc = lambda do @validators.each do |v| if validation_context == v.options.fetch(:on, validation_context) v.validate(model) if validate?(v, model) end end end if model.respond_to?(:run_validation_callbacks) model.send(:_run_validation_callbacks, &validation_proc) else model.send(:run_callbacks, :validation, &validation_proc) end model.send(:validation_context=, current_context) model.errors.empty? end
def validate?(validator, model)
def validate?(validator, model) evaluate = lambda do |condition| case condition when String then model.instance_eval(condition) when Symbol then model.send(condition) when Proc then model.instance_eval(&condition) end end Array(validator.options[:if]).map(&evaluate).compact.all? && !Array(validator.options[:unless]).map(&evaluate).compact.any? end