module ActiveRecord module AutosaveAssociation private # Saves the associated record if it's new or :autosave is enabled. # # In addition, it will destroy the association if it was marked for destruction. def save_belongs_to_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? 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.read_attribute(reflection.options[:primary_key]) : record.id self[reflection.foreign_key] = association_id association.loaded! end saved if autosave end end end # 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. 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] ? read_attribute(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 end saved = record.save(:validate => !autosave) raise ActiveRecord::Rollback if !saved && autosave saved end end end end end end