Saves any new associated records, or all loaded autosave associations if
:autosave is enabled on the association.
In addition, it destroys all children that were 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 381
def save_collection_association(reflection)
if association = association_instance_get(reflection.name)
autosave = reflection.options[:autosave]
# reconstruct the scope now that we know the owner's id
association.reset_scope
if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
if autosave
records_to_destroy = records.select(&:marked_for_destruction?)
records_to_destroy.each { |record| association.destroy(record) }
records -= records_to_destroy
end
records.each do |record|
next if record.destroyed?
saved = true
if autosave != false && (@new_record_before_save || record.new_record?)
if autosave
saved = association.insert_record(record, false)
elsif !reflection.nested?
association_saved = association.insert_record(record)
if reflection.validate?
errors.add(reflection.name) unless association_saved
saved = association_saved
end
end
elsif autosave
saved = record.save(validate: false)
end
raise ActiveRecord::Rollback unless saved
end
end
end
end