mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix scope chaining + STI
See #9869 and #9929. The problem arises from the following example: class Project < ActiveRecord::Base scope :completed, -> { where completed: true } end class MajorProject < Project end When calling: MajorProject.where(tasks_count: 10).completed This expands to: MajorProject.where(tasks_count: 10).scoping { MajorProject.completed } However the lambda for the `completed` scope is defined on Project. This means that when it is called, `self` is Project rather than MajorProject. So it expands to: MajorProject.where(tasks_count: 10).scoping { Project.where(completed: true) } Since the scoping was applied on MajorProject, and not Project, this fails to apply the tasks_count condition. The solution is to make scoping apply across STI classes. I am slightly concerned about the possible side-effects of this, but no tests fail and it seems ok. I guess we'll see.
This commit is contained in:
parent
f029fb07c2
commit
8606a7fbe9
4 changed files with 5 additions and 11 deletions
|
@ -9,11 +9,11 @@ module ActiveRecord
|
|||
|
||||
module ClassMethods
|
||||
def current_scope #:nodoc:
|
||||
Thread.current["#{self}_current_scope"]
|
||||
Thread.current["#{base_class}_current_scope"]
|
||||
end
|
||||
|
||||
def current_scope=(scope) #:nodoc:
|
||||
Thread.current["#{self}_current_scope"] = scope
|
||||
Thread.current["#{base_class}_current_scope"] = scope
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -160,13 +160,8 @@ module ActiveRecord
|
|||
|
||||
singleton_class.send(:define_method, name) do |*args|
|
||||
if body.respond_to?(:call)
|
||||
scope = extension ? body.call(*args).extending(extension) : body.call(*args)
|
||||
|
||||
if scope
|
||||
default_scoped = scope.default_scoped
|
||||
scope = relation.merge(scope)
|
||||
scope.default_scoped = default_scoped
|
||||
end
|
||||
scope = all.scoping { body.call(*args) }
|
||||
scope = scope.extending(extension) if extension
|
||||
else
|
||||
scope = body
|
||||
end
|
||||
|
|
|
@ -461,7 +461,7 @@ class NamedScopingTest < ActiveRecord::TestCase
|
|||
end
|
||||
|
||||
def test_subclass_merges_scopes_properly
|
||||
assert_equal 1, SpecialComment.crazy_all.count
|
||||
assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -29,7 +29,6 @@ class Comment < ActiveRecord::Base
|
|||
end
|
||||
|
||||
class SpecialComment < Comment
|
||||
scope :crazy_all, -> { where(body: 'go crazy').created }
|
||||
end
|
||||
|
||||
class SubSpecialComment < SpecialComment
|
||||
|
|
Loading…
Reference in a new issue