Skip to content

Commit

Permalink
Merge pull request #377 from cfinucane/fix/has_one_autosave
Browse files Browse the repository at this point in the history
extend approach from #344 to fix autosave for has_one associations as well
  • Loading branch information
cfis committed Jan 14, 2017
2 parents a9f29f4 + a886505 commit 6b620b7
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions lib/composite_primary_keys/autosave_association.rb
Expand Up @@ -27,5 +27,39 @@ def save_belongs_to_association(reflection)
end
end
end

# Saves the associated record if it's new or <tt>:autosave</tt> 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
# it will fail to use "#send(reflection.options[:primary_key])" for CPK
key = reflection.options[:primary_key] ? record.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

0 comments on commit 6b620b7

Please sign in to comment.