[WIP] Aliased foreign keys in association definitions #20682
Closed
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.
Hello,
this is first step in a feature I'd like to implement. My post on the rails-core mailing list is here https://groups.google.com/forum/?fromgroups#!topic/rubyonrails-core/PQCBPn_fK-w
This PR is intentionally not done because it is still not clear if this is a change that is consider warranted for the problem it solves. I've implemented only support for
belongs_to
to get a grasp on the change and how it affects performanceProblem
When using an aliased attribute as the foreign key for a association rails does not behave as expected.
Example
Suggested fix
Places where the value of the foreign key in the owner is determined use
_read_attribute
orActiveRecord::Base.[]
this bypasses aliased attributes completely. To combat this I suggest that an explicit check or fallback is added to consider aliased attributesPerformance
Doing the extra work to figure out wether the foreign_key is aliased will take some extra time. Depending on how it is implemented the work could be a small constant slowdown or a heavier slowdown in edge cases, but with a very small effect on the most common case. The following examples uses
active_record/lib/active_record/associations/belongs_to_association.rb#foreign_key_present?
to illustrate the change and it's impact on performance.Edge case slowdown
Constant slowdown