aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-01-10 22:13:21 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-01-10 22:20:14 +0900
commit5a593486f5c8a73f2be200a409b0a14dff51790c (patch)
tree6766f9b10cb7dd780eb1515fd75f4d3aa784d993 /activerecord/lib
parente97221a32d02cb0691760fc1783da74e4c3a371a (diff)
downloadrails-5a593486f5c8a73f2be200a409b0a14dff51790c.tar.gz
rails-5a593486f5c8a73f2be200a409b0a14dff51790c.tar.bz2
rails-5a593486f5c8a73f2be200a409b0a14dff51790c.zip
Fix `stale_state` for nested `has_many :through` associations
Need reloading when through record has replaced.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/associations/through_association.rb15
-rw-r--r--activerecord/lib/active_record/reflection.rb8
2 files changed, 13 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/associations/through_association.rb b/activerecord/lib/active_record/associations/through_association.rb
index 806397f83a..54673b74f7 100644
--- a/activerecord/lib/active_record/associations/through_association.rb
+++ b/activerecord/lib/active_record/associations/through_association.rb
@@ -4,9 +4,20 @@ module ActiveRecord
module Associations
# = Active Record Through Association
module ThroughAssociation #:nodoc:
- delegate :source_reflection, :through_reflection, to: :reflection
+ delegate :source_reflection, to: :reflection
private
+ def through_reflection
+ @through_reflection ||= begin
+ refl = reflection.through_reflection
+
+ while refl.through_reflection?
+ refl = refl.through_reflection
+ end
+
+ refl
+ end
+ end
# We merge in these scopes for two reasons:
#
@@ -68,7 +79,7 @@ module ActiveRecord
end
def foreign_key_present?
- through_reflection.belongs_to_or_through? && !owner[through_reflection.foreign_key].nil?
+ through_reflection.belongs_to? && !owner[through_reflection.foreign_key].nil?
end
def ensure_mutable
diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index 7b53f9c15c..9e32b69786 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -504,10 +504,6 @@ module ActiveRecord
@association_scope_cache.clear
end
- def belongs_to_or_through?
- belongs_to?
- end
-
def nested?
false
end
@@ -840,10 +836,6 @@ module ActiveRecord
source_reflection.join_scopes(table, predicate_builder) + super
end
- def belongs_to_or_through?
- through_reflection.belongs_to_or_through?
- end
-
def has_scope?
scope || options[:source_type] ||
source_reflection.has_scope? ||