Skip to content

Instantly share code, notes, and snippets.

@malomalo
Created May 29, 2024 16:03
Show Gist options
  • Save malomalo/53d8ce5e0cab50b2b14b28e1c353e753 to your computer and use it in GitHub Desktop.
Save malomalo/53d8ce5e0cab50b2b14b28e1c353e753 to your computer and use it in GitHub Desktop.
require 'active_record/autosave_association'
module ActiveRecord
module AutosaveAssociation
private
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 = Array(reflection.foreign_key)
foreign_key.each { |key| self[key] = nil }
record.destroy
elsif autosave != false
saved = record.save(validate: !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
if association.updated?
primary_key = Array(compute_primary_key(reflection, record)).map(&:to_s)
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 = record._read_attribute(primary_key)
self[foreign_key] = association_id unless self[foreign_key] == association_id
end
association.loaded!
end
saved# if autosave
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment