class ActiveRecord::Associations::CollectionAssociation

def replace_on_target(record, skip_callbacks, replace:, inversing: false)

def replace_on_target(record, skip_callbacks, replace:, inversing: false)
  if replace && (!record.new_record? || @replaced_or_added_targets.include?(record))
    index = @target.index(record)
  end
  catch(:abort) do
    callback(:before_add, record)
  end || return unless skip_callbacks
  set_inverse_instance(record)
  @_was_loaded = true
  yield(record) if block_given?
  if !index && @replaced_or_added_targets.include?(record)
    index = @target.index(record)
  end
  @replaced_or_added_targets << record if inversing || index || record.new_record?
  if index
    target[index] = record
  elsif @_was_loaded || !loaded?
    @association_ids = nil
    target << record
  end
  callback(:after_add, record) unless skip_callbacks
  record
ensure
  @_was_loaded = nil
end