From 3f1254d0a60c8111cbf664075598570be4923a12 Mon Sep 17 00:00:00 2001 From: Pavel Gorbokon Date: Thu, 2 Dec 2010 19:27:08 +0200 Subject: [PATCH] Do not load ActiveRecord::NamedScope::Scope#proxy_found on #is_a?, #kind_of?, #instance_of? calls. [#6104 state:resolved] --- activerecord/lib/active_record/named_scope.rb | 2 +- activerecord/test/cases/named_scope_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletions(-) diff --git a/activerecord/lib/active_record/named_scope.rb b/activerecord/lib/active_record/named_scope.rb index 5e49de6..81d0194 100644 --- a/activerecord/lib/active_record/named_scope.rb +++ b/activerecord/lib/active_record/named_scope.rb @@ -107,7 +107,7 @@ module ActiveRecord class Scope attr_reader :proxy_scope, :proxy_options, :current_scoped_methods_when_defined - NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set + NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to? is_a? kind_of? instance_of?).to_set [].methods.each do |m| unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s) delegate m, :to => :proxy_found diff --git a/activerecord/test/cases/named_scope_test.rb b/activerecord/test/cases/named_scope_test.rb index 755fb04..cf06a5c 100644 --- a/activerecord/test/cases/named_scope_test.rb +++ b/activerecord/test/cases/named_scope_test.rb @@ -349,6 +349,29 @@ class NamedScopeTest < ActiveRecord::TestCase Comment.for_first_post.for_first_author.all end end + + def test_no_loading_proxy_found_on_is_a_method + # Use a bad SQL statement to raise an error because + # there no way to know if scope has been loaded or not + bad_scope = Post.scoped(:conditions => "bad SQL $%(^&*[]") + + assert_raise(ActiveRecord::StatementInvalid) { bad_scope.first } + assert_nothing_raised { bad_scope.is_a?(::Hash) } + assert_nothing_raised { [bad_scope].extract_options! } + end + + def test_no_loading_proxy_found_on_kind_of_method + bad_scope = Post.scoped(:conditions => "bad SQL $%(^&*[]") + assert_raise(ActiveRecord::StatementInvalid) { bad_scope.first } + assert_nothing_raised { bad_scope.kind_of?(::Hash) } + end + + def test_no_loading_proxy_found_on_instance_of_method + bad_scope = Post.scoped(:conditions => "bad SQL $%(^&*[]") + assert_raise(ActiveRecord::StatementInvalid) { bad_scope.first } + assert_nothing_raised { bad_scope.instance_of?(::Hash) } + end + end class DynamicScopeMatchTest < ActiveRecord::TestCase -- 1.7.3.2