From cd1be1acc68221fbdfab0d13211d40bdeae630dc Mon Sep 17 00:00:00 2001
From: kennyj <kennyj@gmail.com>
Date: Thu, 7 Jun 2012 12:55:39 +0900
Subject: Fix #6635. We should call Scoping methods, before calling Array
 methods.

---
 activerecord/lib/active_record/relation/delegation.rb | 10 +++++-----
 activerecord/test/cases/named_scope_test.rb           |  9 +++++++++
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/activerecord/lib/active_record/relation/delegation.rb b/activerecord/lib/active_record/relation/delegation.rb
index f5fdf437bf..64dda4f35a 100644
--- a/activerecord/lib/active_record/relation/delegation.rb
+++ b/activerecord/lib/active_record/relation/delegation.rb
@@ -32,12 +32,12 @@ module ActiveRecord
     protected
 
     def method_missing(method, *args, &block)
-      if Array.method_defined?(method)
-        ::ActiveRecord::Delegation.delegate method, :to => :to_a
-        to_a.send(method, *args, &block)
-      elsif @klass.respond_to?(method)
+      if @klass.respond_to?(method)
         ::ActiveRecord::Delegation.delegate_to_scoped_klass(method)
         scoping { @klass.send(method, *args, &block) }
+      elsif Array.method_defined?(method)
+        ::ActiveRecord::Delegation.delegate method, :to => :to_a
+        to_a.send(method, *args, &block)
       elsif arel.respond_to?(method)
         ::ActiveRecord::Delegation.delegate method, :to => :arel
         arel.send(method, *args, &block)
@@ -46,4 +46,4 @@ module ActiveRecord
       end
     end
   end
-end
\ No newline at end of file
+end
diff --git a/activerecord/test/cases/named_scope_test.rb b/activerecord/test/cases/named_scope_test.rb
index 2762afc921..c886160af3 100644
--- a/activerecord/test/cases/named_scope_test.rb
+++ b/activerecord/test/cases/named_scope_test.rb
@@ -45,6 +45,15 @@ class NamedScopeTest < ActiveRecord::TestCase
     assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
   end
 
+  def test_method_missing_priority_when_delegating
+    klazz = Class.new(ActiveRecord::Base) do
+      self.table_name = "topics"
+      scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
+      scope :to,    Proc.new { where('written_on <= ?', Time.now) }
+    end
+    assert_equal klazz.to.since.all, klazz.since.to.all
+  end
+
   def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
     assert Topic.approved.respond_to?(:limit)
     assert Topic.approved.respond_to?(:count)
-- 
cgit v1.2.3