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

Code before:
        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? || 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 record == self
          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
        previously_new_record_before_save = (@new_record_before_save ||= false)
        @new_record_before_save = !previously_new_record_before_save && new_record?

        yield
      ensure
        @new_record_before_save = previously_new_record_before_save
      end

      # Saves any new associated records, or all loaded autosave associations if
      # <tt>:autosave</tt> is enabled on the association.

Review comment (suggestion):
```suggestion
          return if equal?(record)
```
I think would be more strict? I'm a bit worried about the consequence of using `==` for Active Record.

Code after:
        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? || 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
        previously_new_record_before_save = (@new_record_before_save ||= false)
        @new_record_before_save = !previously_new_record_before_save && new_record?

        yield
      ensure
        @new_record_before_save = previously_new_record_before_save
      end

      # Saves any new associated records, or all loaded autosave associations if