Saves the associated record if it’s new or :autosave is enabled
on the association.
In addition, it will destroy the association if it was marked for
destruction with #mark_for_destruction.
This all happens inside a transaction, if the Transactions module is included
into ActiveRecord::Base after the
AutosaveAssociation module, which it does by default.
# File activerecord/lib/active_record/autosave_association.rb, line 463
def save_has_one_association(reflection)
association = association_instance_get(reflection.name)
return unless association && association.loaded?
record = association.load_target
return unless record && !record.destroyed?
autosave = reflection.options[:autosave]
if autosave && record.marked_for_destruction?
record.destroy
elsif autosave != false
primary_key = Array(compute_primary_key(reflection, self)).map(&:to_s)
primary_key_value = primary_key.map { |key| _read_attribute(key) }
return unless (autosave && record.changed_for_autosave?) || _record_changed?(reflection, record, primary_key_value)
unless reflection.through_reflection
foreign_key = Array(reflection.foreign_key)
primary_key_foreign_key_pairs = primary_key.zip(foreign_key)
primary_key_foreign_key_pairs.each do |primary_key, foreign_key|
association_id = _read_attribute(primary_key)
record[foreign_key] = association_id unless record[foreign_key] == association_id
end
association.set_inverse_instance(record)
end
inverse_association = reflection.inverse_of && record.association(reflection.inverse_of.name)
return if inverse_association && record.autosaving_belongs_to_for?(inverse_association)
saved = record.save(validate: !autosave)
raise ActiveRecord::Rollback if !saved && autosave
saved
end
end