Improve singular association creation #46386
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation / Background
Replacing a
has_one
association nowadays is very confusing...create_association
callsINSERT
thenDELETE
in different transactions whilerecord.assoctiation = new_record
callsDELETE
thenINSERT
in a single transaction.create_association
raises an exception if your association is backed by a unique index, since it first try to create the new record before delete the old one.create_association
is prone to create duplicated rows if your association is not backed by a unique index, even though it has a logic to delete the old record later.Fixes #45920
Detail
This pull request improves the
create_association
method to work similarly torecord.assoctiation = new_record
, so when replacing an association, a single transaction is created and the old record is deleted before a new one is created, making the method safer with a unique index or not and less confusing.Before:
After:
Additional information
https://andycroll.com/ruby/be-careful-assigning-to-has-one-relations
Checklist
Before submitting the PR make sure the following are checked:
[Fix #issue-number]