diff --git a/activerecord/lib/active_record/named_scope.rb b/activerecord/lib/active_record/named_scope.rb index 83043c2..1dd37af 100644 --- a/activerecord/lib/active_record/named_scope.rb +++ b/activerecord/lib/active_record/named_scope.rb @@ -88,7 +88,12 @@ module ActiveRecord when Hash options when Proc - options.call(*args) + # Make sure named_scope is invoking lambda from right self context + if self.model_name != parent_scope.model_name + parent_scope.instance_exec(*args, &options) + else + options.call(*args) + end end, &block) end (class << self; self end).instance_eval do diff --git a/activerecord/test/cases/named_scope_test.rb b/activerecord/test/cases/named_scope_test.rb index 64e8997..850a450 100644 --- a/activerecord/test/cases/named_scope_test.rb +++ b/activerecord/test/cases/named_scope_test.rb @@ -5,6 +5,7 @@ require 'models/comment' require 'models/reply' require 'models/author' require 'models/developer' +require 'models/company' class NamedScopeTest < ActiveRecord::TestCase fixtures :posts, :authors, :topics, :comments, :author_addresses @@ -277,4 +278,10 @@ class NamedScopeTest < ActiveRecord::TestCase post = Post.find(1) assert_equal post.comments.size, Post.scoped(:joins => join).scoped(:joins => join, :conditions => "posts.id = #{post.id}").size end + + def test_sti_named_scope + firm_includes = Firm.scopes[:include_all].call(Firm, :all).proxy_options[:include] + firm_reflections_keys = Firm.reflections.keys + assert_equal firm_includes, firm_reflections_keys + end end diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb index 0e3fafa..e5be682 100644 --- a/activerecord/test/models/company.rb +++ b/activerecord/test/models/company.rb @@ -1,5 +1,6 @@ class AbstractCompany < ActiveRecord::Base self.abstract_class = true + named_scope :include_all, lambda { { :include => self.reflections.keys } } end class Company < AbstractCompany