From 3efa9a357882d670ae9ecddd64acb8a8b02bbd9f Mon Sep 17 00:00:00 2001 From: Jordan Owens Date: Thu, 29 Aug 2024 15:36:19 -0400 Subject: [PATCH] Disable validations for associations --- lib/activerecord-import/import.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/activerecord-import/import.rb b/lib/activerecord-import/import.rb index bd1e2c4f..b872e826 100644 --- a/lib/activerecord-import/import.rb +++ b/lib/activerecord-import/import.rb @@ -38,15 +38,18 @@ def init_validations(klass) @validate_callbacks.each_with_index do |callback, i| filter = callback.respond_to?(:raw_filter) ? callback.raw_filter : callback.filter next unless filter.class.name =~ /Validations::PresenceValidator/ || + (filter.is_a?(Symbol) && filter.to_s =~ /validate_associated_records_for/) || (!@options[:validate_uniqueness] && filter.is_a?(ActiveRecord::Validations::UniquenessValidator)) callback = callback.dup filter = filter.dup - attrs = filter.instance_variable_get(:@attributes).dup + attrs = filter.instance_variable_get(:@attributes).dup || [] + if_condition = callback.instance_variable_get(:@if).dup + skip_proc = -> { false } - if filter.is_a?(ActiveRecord::Validations::UniquenessValidator) - attrs = [] + if filter.is_a?(Symbol) || filter.is_a?(ActiveRecord::Validations::UniquenessValidator) + if_condition = [skip_proc] unless filter.is_a?(Symbol) && options[:all_or_none] else associations = klass.reflect_on_all_associations(:belongs_to) associations.each do |assoc| @@ -57,16 +60,18 @@ def init_validations(klass) end end - filter.instance_variable_set(:@attributes, attrs.flatten) + filter.instance_variable_set(:@attributes, attrs.flatten) unless filter.is_a?(Symbol) if @validate_callbacks.respond_to?(:chain, true) @validate_callbacks.send(:chain).tap do |chain| callback.instance_variable_set(:@filter, filter) + callback.instance_variable_set(:@if, if_condition) callback.instance_variable_set(:@compiled, nil) chain[i] = callback end else callback.raw_filter = filter + callback.options = callback.options.merge(if: if_condition) callback.filter = callback.send(:_compile_filter, filter) @validate_callbacks[i] = callback end