Repository: rails/rails
File: activerecord/lib/active_record/autosave_association.rb (Ruby)

Code before:
        ensure
          @validating_belongs_to_for[association] = false
        end
      end

      # Validate the associated records if <tt>:validate</tt> or
      # <tt>:autosave</tt> is turned on for the association specified by
      # +reflection+.
      def validate_collection_association(reflection)
        if association = association_instance_get(reflection.name)
          if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
            records.each { |record| association_valid?(association, record) }
          end
        end
      end

      # Returns whether or not the association is valid and applies any errors to
      # the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
      # enabled records if they're marked_for_destruction? or destroyed.
      def association_valid?(association, record)
        return true if record.destroyed? || (association.options[:autosave] && record.marked_for_destruction?)

        context = validation_context if custom_validation_context?
        return true if record.valid?(context)

        if record.changed_for_autosave? || record.new_record? || context
          associated_errors = record.errors.objects
        else
          # If there are existing invalid records in the DB, we should still be able to reference them.
          # Unless a record (no matter where in the association chain) is invalid and is being changed.
          associated_errors = record.errors.objects.select { |error| error.is_a?(Associations::NestedError) }
        end

        if association.options[:autosave]
          return if equal?(record)

          associated_errors.each { |error|
            errors.objects.append(
              Associations::NestedError.new(association, error)
            )
          }
        elsif associated_errors.any?
          errors.add(association.reflection.name)
        end

        errors.any?
      end

      # Is used as an around_save callback to check while saving a collection
      # association whether or not the parent was a new record before saving.
      def around_save_collection_association

Review comment (suggestion):
```suggestion
        if context || record.changed_for_autosave?
```

Two nitpicks:

  - `changed_for_autosave?` is `new_record? || has_changes_to_save? || ..`, so no need to check for new_record again.
  - Best to check the cheaper condition first.

Code after:
        ensure
          @validating_belongs_to_for[association] = false
        end
      end

      # Validate the associated records if <tt>:validate</tt> or
      # <tt>:autosave</tt> is turned on for the association specified by
      # +reflection+.
      def validate_collection_association(reflection)
        if association = association_instance_get(reflection.name)
          if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
            records.each { |record| association_valid?(association, record) }
          end
        end
      end

      # Returns whether or not the association is valid and applies any errors to
      # the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
      # enabled records if they're marked_for_destruction? or destroyed.
      def association_valid?(association, record)
        return true if record.destroyed? || (association.options[:autosave] && record.marked_for_destruction?)

        context = validation_context if custom_validation_context?
        return true if record.valid?(context)

        if context || record.changed_for_autosave?
          associated_errors = record.errors.objects
        else
          # If there are existing invalid records in the DB, we should still be able to reference them.
          # Unless a record (no matter where in the association chain) is invalid and is being changed.
          associated_errors = record.errors.objects.select { |error| error.is_a?(Associations::NestedError) }
        end

        if association.options[:autosave]
          return if equal?(record)

          associated_errors.each { |error|
            errors.objects.append(
              Associations::NestedError.new(association, error)
            )
          }
        elsif associated_errors.any?
          errors.add(association.reflection.name)
        end

        errors.any?
      end

      # Is used as an around_save callback to check while saving a collection
      # association whether or not the parent was a new record before saving.
      def around_save_collection_association