-
Notifications
You must be signed in to change notification settings - Fork 21.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refactor inversing logic of CollectionAssociation
#45399
Open
jonathanhefner
wants to merge
1
commit into
rails:main
Choose a base branch
from
jonathanhefner:collection_association-refactor-inversing-logic
base: main
Could not load branches
Branch not found: {{ refName }}
Could not load tags
Nothing to show
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doesn't this changes the behavior on
build
whenreplace:
was being passed astrue
? Now it will useassociation_scope.distinct_value
to determine if it should replace or not.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I understand correctly,
replace: true
was added in 50e4aaa because the following line ends up callingreplace_on_target
twice:rails/activerecord/lib/active_record/associations/collection_association.rb
Line 119 in ec4558a
The 1st time via
target=
inside thebuild_record
call, and the 2nd time viaadd_to_target
.For the 2nd call,
replace: true
causes the following conditional to computeindex
:rails/activerecord/lib/active_record/associations/collection_association.rb
Lines 449 to 452 in ec4558a
However, a "fallback" was also added in 6f6c441 to compute
index
anyway:rails/activerecord/lib/active_record/associations/collection_association.rb
Lines 464 to 466 in ec4558a
In other words, I believe
replace: true
insidebuild
is no longer necessary even onmain
.That said, this PR changes how targets are tracked. With this PR,
CollectionAssociation#inversed_from
will overrideAssociation#inversed_from
, sobuild_record
insidebuild
will calladd_record
withimplicit: true
instead oftarget=
.Thus the 2nd call to
add_to_target
/add_record
will find the record in@implicit_target_records
and replace it atindex
:rails/activerecord/lib/active_record/associations/collection_association.rb
Lines 458 to 462 in ed79453
It has been a long time since I looked at this code though, so I could be missing something. A while ago I asked Eileen to test this branch against the Shopify codebase, and she said there were errors but the cause wasn't clear. Unfortunately, I was not able to dig further.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah. I just tried this PR again and there were some errors. Some of them is because we were calling
add_to_target
directly withreplace: true
. The others were is not clear. But points to me that some behavior is changing in this refactoring, so I was trying to see visually what would be the low hanging fruits. I can dig deeper.