From 257aea9ef53d21231e4f2b4d87140ca0bcefae55 Mon Sep 17 00:00:00 2001 From: Timothy N. Tsvetkov Date: Mon, 17 Jan 2011 04:19:09 +0300 Subject: [PATCH] Fix for #6297: Raise an exception when trying to merge default_scope with a default_scope which has callable argument --- activerecord/lib/active_record/base.rb | 1 + activerecord/test/cases/relation_scoping_test.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 47dc2d4..bfb743e 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1141,6 +1141,7 @@ MSG def default_scope(options = {}) reset_scoped_methods default_scoping = self.default_scoping.dup + raise ArgumentError, "Can't merge default_scope with default_scope with something that can be called" if options.respond_to?(:call) && default_scoping.present? || default_scoping.last.respond_to?(:call) self.default_scoping = default_scoping << construct_finder_arel(options, default_scoping.pop) end diff --git a/activerecord/test/cases/relation_scoping_test.rb b/activerecord/test/cases/relation_scoping_test.rb index 1bdf313..bed451a 100644 --- a/activerecord/test/cases/relation_scoping_test.rb +++ b/activerecord/test/cases/relation_scoping_test.rb @@ -339,6 +339,24 @@ class DefaultScopingTest < ActiveRecord::TestCase assert_equal 2, records.first.author_id end + def test_default_scope_cant_be_merged_with_something_that_responds_to_call + assert_raise(ArgumentError) { + Class.new(ActiveRecord::Base) do + self.table_name = 'developers' + default_scope where('salary >= 10000') + default_scope lambda { order('salary DESC') } + end + } + + assert_raise(ArgumentError) { + Class.new(ActiveRecord::Base) do + self.table_name = 'developers' + default_scope lambda { order('salary DESC') } + default_scope where('salary >= 10000') + end + } + end + def test_default_scope_is_unscoped_on_find assert_equal 1, DeveloperCalledDavid.count assert_equal 11, DeveloperCalledDavid.unscoped.count -- 1.7.1