aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/reflection.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2017-03-03 11:15:58 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2017-03-03 11:29:43 -0800
commita5651eb522bd656f21f2f2da57d6326a6bd28372 (patch)
treef92679a2d4494846ec1107ff57ecfdc1d6cfd5f9 /activerecord/lib/active_record/reflection.rb
parent76be78c59cd75eaafb31719745b43df4743fd33d (diff)
downloadrails-a5651eb522bd656f21f2f2da57d6326a6bd28372.tar.gz
rails-a5651eb522bd656f21f2f2da57d6326a6bd28372.tar.bz2
rails-a5651eb522bd656f21f2f2da57d6326a6bd28372.zip
Move join scopes on to the reflection object
Scopes can only ever be *not* reflection objects when they are passed in to the Reflection constructor. Given this fact, we can eliminate is_a checks and an intermediate array object by just asking the reflection object for join scopes.
Diffstat (limited to 'activerecord/lib/active_record/reflection.rb')
-rw-r--r--activerecord/lib/active_record/reflection.rb22
1 files changed, 22 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index 61a2279292..02aab25610 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -187,6 +187,15 @@ module ActiveRecord
end
deprecate :scope_chain
+ def join_scopes(table, predicate_builder) # :nodoc:
+ if scope
+ [ActiveRecord::Relation.create(klass, table, predicate_builder)
+ .instance_exec(&scope)]
+ else
+ []
+ end
+ end
+
def constraints
chain.map(&:scopes).flatten
end
@@ -806,6 +815,10 @@ module ActiveRecord
source_reflection.scopes + super
end
+ def join_scopes(table, predicate_builder) # :nodoc:
+ source_reflection.join_scopes(table, predicate_builder) + super
+ end
+
def source_type_scope
through_reflection.klass.where(foreign_type => options[:source_type])
end
@@ -990,6 +1003,15 @@ module ActiveRecord
end
end
+ def join_scopes(table, predicate_builder) # :nodoc:
+ scopes = @previous_reflection.join_scopes(table, predicate_builder) + super
+ if @previous_reflection.options[:source_type]
+ scopes + [@previous_reflection.source_type_scope]
+ else
+ scopes
+ end
+ end
+
def klass
@reflection.klass
end