module ActiveRecord module AutosaveAssociation def save_has_one_association(reflection) association = association_instance_get(reflection.name) record = association && association.load_target if record && !record.destroyed? autosave = reflection.options[:autosave] if autosave && record.marked_for_destruction? record.destroy elsif autosave != false # CPK #key = reflection.options[:primary_key] ? send(reflection.options[:primary_key]) : id key = reflection.options[:primary_key] ? self[reflection.options[:primary_key]] : id if (autosave && record.changed_for_autosave?) || new_record? || _record_changed?(reflection, record, key) unless reflection.through_reflection record[reflection.foreign_key] = key if inverse_reflection = reflection.inverse_of record.association(inverse_reflection.name).loaded! end end saved = record.save(validate: !autosave) raise ActiveRecord::Rollback if !saved && autosave saved end end end end def save_belongs_to_association(reflection) association = association_instance_get(reflection.name) return unless association && association.loaded? && !association.stale_target? record = association.load_target if record && !record.destroyed? autosave = reflection.options[:autosave] if autosave && record.marked_for_destruction? self[reflection.foreign_key] = nil record.destroy elsif autosave != false saved = record.save(validate: !autosave) if record.new_record? || (autosave && record.changed_for_autosave?) if association.updated? # CPK # association_id = record.send(reflection.options[:primary_key] || :id) association_id = reflection.options[:primary_key] ? record[reflection.options[:primary_key]] : record.id self[reflection.foreign_key] = association_id association.loaded! end saved if autosave end end end end end