instance method
save_belongs_to_association
Ruby on Rails edge
Since v2.3.18 Private — implementation detail, not part of the public APISignature
save_belongs_to_association(reflection)
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.
Parameters
-
reflectionreq
Source
# File activerecord/lib/active_record/autosave_association.rb, line 545
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?
foreign_key = ActiveRecord::Key.for(reflection.foreign_key)
foreign_key.each { |key| write_attribute(key, nil) }
record.destroy
elsif autosave != false
saved = if record.new_record? || (autosave && record.changed_for_autosave?)
begin
@autosaving_belongs_to_for ||= {}
@autosaving_belongs_to_for[association] = true
record.save(validate: !autosave)
ensure
@autosaving_belongs_to_for[association] = false
end
end
if association.updated?
primary_key = ActiveRecord::Key.for(reflection.association_primary_key(record.class))
foreign_key = ActiveRecord::Key.for(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 = record.read_attribute(primary_key)
write_attribute(foreign_key, association_id) unless read_attribute(foreign_key) == association_id
end
association.loaded!
end
saved if autosave
end
end
end
Defined in activerecord/lib/active_record/autosave_association.rb line 545
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveRecord::AutosaveAssociation