diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-02-01 16:58:29 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-02-01 16:58:29 -0800 |
commit | 83c19734fbaeb644d46a4dcc197c941841c4e268 (patch) | |
tree | f91555ce55e52110d6fc7df6401aa13e227137ee /activerecord/lib | |
parent | 226cd8a094c81edb72143173e4d0c88a2eb01d5f (diff) | |
parent | 27aa4dda7d89ce7332e6d1f3266c3a0cf1c3fb9e (diff) | |
download | rails-83c19734fbaeb644d46a4dcc197c941841c4e268.tar.gz rails-83c19734fbaeb644d46a4dcc197c941841c4e268.tar.bz2 rails-83c19734fbaeb644d46a4dcc197c941841c4e268.zip |
Merge pull request #18612 from eileencodes/fix-validates-on-associated-record-if-parent-is-validate-false
Fix validations on child record when record parent has validate: false
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/validations/length.rb | 12 | ||||
-rw-r--r-- | activerecord/lib/active_record/validations/presence.rb | 1 | ||||
-rw-r--r-- | activerecord/lib/active_record/validations/uniqueness.rb | 1 |
3 files changed, 14 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/validations/length.rb b/activerecord/lib/active_record/validations/length.rb index ef5a6cbbe7..5991fbad8e 100644 --- a/activerecord/lib/active_record/validations/length.rb +++ b/activerecord/lib/active_record/validations/length.rb @@ -2,11 +2,23 @@ module ActiveRecord module Validations class LengthValidator < ActiveModel::Validations::LengthValidator # :nodoc: def validate_each(record, attribute, association_or_value) + return unless should_validate?(record) || associations_are_dirty?(record) if association_or_value.respond_to?(:loaded?) && association_or_value.loaded? association_or_value = association_or_value.target.reject(&:marked_for_destruction?) end super end + + def associations_are_dirty?(record) + attributes.any? do |attribute| + value = record.read_attribute_for_validation(attribute) + if value.respond_to?(:loaded?) && value.loaded? + value.target.any?(&:marked_for_destruction?) + else + false + end + end + end end module ClassMethods diff --git a/activerecord/lib/active_record/validations/presence.rb b/activerecord/lib/active_record/validations/presence.rb index 61b30749d9..75d5bd5a35 100644 --- a/activerecord/lib/active_record/validations/presence.rb +++ b/activerecord/lib/active_record/validations/presence.rb @@ -2,6 +2,7 @@ module ActiveRecord module Validations class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc: def validate(record) + return unless should_validate?(record) super attributes.each do |attribute| next unless record.class._reflect_on_association(attribute) diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb index 8f7a46f2c7..ad56f637e3 100644 --- a/activerecord/lib/active_record/validations/uniqueness.rb +++ b/activerecord/lib/active_record/validations/uniqueness.rb @@ -11,6 +11,7 @@ module ActiveRecord end def validate_each(record, attribute, value) + return unless should_validate?(record) finder_class = find_finder_class_for(record) table = finder_class.arel_table value = map_enum_attribute(finder_class, attribute, value) |