diff options
author | John Hawthorn <john@stembolt.com> | 2017-06-20 17:35:13 -0700 |
---|---|---|
committer | John Hawthorn <john@stembolt.com> | 2017-06-20 17:40:08 -0700 |
commit | c7f669af6f1d8e9053a586c97584702971e1906c (patch) | |
tree | db0526246e0c33a617d8dcf106a88ffe07efa2de /activerecord/lib/active_record | |
parent | 0787727cd65d820df78c9cd71ac9f145c9834762 (diff) | |
download | rails-c7f669af6f1d8e9053a586c97584702971e1906c.tar.gz rails-c7f669af6f1d8e9053a586c97584702971e1906c.tar.bz2 rails-c7f669af6f1d8e9053a586c97584702971e1906c.zip |
Clear offset cache on CollectionProxy reset/reload
The `@offsets` cache is used by FinderMethods to cache records found by
find_nth. This cache is cleared in AR::Relation#reset, but not in
CollectionProxy#reset or CollectionProxy#reload.
Because of this, since #29098, calling #first/#find_nth/etc after
calling #reload or #reset on an association could return a stale record.
This is an issue both when the full association target is loaded and
when the item is loaded in #find_nth.
This commit solves the problem by clearing the `@offsets` cache in
CollectionProxy#reset and CollectionProxy#reload.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/associations/collection_proxy.rb | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb index 8cdb508c43..88b05bbcfa 100644 --- a/activerecord/lib/active_record/associations/collection_proxy.rb +++ b/activerecord/lib/active_record/associations/collection_proxy.rb @@ -1088,6 +1088,7 @@ module ActiveRecord # # => [#<Pet id: 1, name: "Snoop", group: "dogs", person_id: 1>] def reload proxy_association.reload + @offsets = {} reset_scope end @@ -1110,6 +1111,7 @@ module ActiveRecord def reset proxy_association.reset proxy_association.reset_scope + @offsets = {} reset_scope end |