aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-02-07 19:40:10 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-02-07 19:44:25 +0900
commit2e018361c7c51e36d1d98bf770b7456d78dee68b (patch)
treea0f15f942a5b18e3c692965ac345f9f4010bb668 /activerecord/lib/active_record/relation.rb
parent973b62dcddd2db45047d32321e6887c841fc5ccf (diff)
downloadrails-2e018361c7c51e36d1d98bf770b7456d78dee68b.tar.gz
rails-2e018361c7c51e36d1d98bf770b7456d78dee68b.tar.bz2
rails-2e018361c7c51e36d1d98bf770b7456d78dee68b.zip
Refactor around scoping
Don't use `false` as special value to skip to find inherited scope, we could use `skip_inherited_scope = true`, and move `_scoping` back on Relation.
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb11
1 files changed, 9 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index bab00ef065..ab3d6f7222 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -312,12 +312,12 @@ module ActiveRecord
# Please check unscoped if you want to remove all previous scopes (including
# the default_scope) during the execution of a block.
def scoping
- @delegate_to_klass && klass.current_scope ? yield : klass._scoping(self) { yield }
+ @delegate_to_klass && klass.current_scope(true) ? yield : _scoping(self) { yield }
end
def _exec_scope(*args, &block) # :nodoc:
@delegate_to_klass = true
- instance_exec(*args, &block) || self
+ _scoping(nil) { instance_exec(*args, &block) || self }
ensure
@delegate_to_klass = false
end
@@ -632,6 +632,13 @@ module ActiveRecord
end
private
+ def _scoping(scope)
+ previous, klass.current_scope = klass.current_scope(true), scope
+ yield
+ ensure
+ klass.current_scope = previous
+ end
+
def _substitute_values(values)
values.map do |name, value|
attr = arel_attribute(name)