public
Fork of rails/rails
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/tomstuart/rails.git
Make named scope #size behave identically to association proxy #size 
(#length if already loaded, #count if not)
tomstuart (author)
Fri Aug 29 07:11:25 -0700 2008
commit  9615d6ae13d5d7bdeaa71be2615aa405e345fbce
tree    2757c7d6ba55f84a5d42321be18d0f307aeb3784
parent  f4d003b52c6bbab677cd64b37276a7a658285ea4
...
103
104
105
106
 
107
108
109
...
136
137
138
 
 
 
 
139
140
141
...
103
104
105
 
106
107
108
109
...
136
137
138
139
140
141
142
143
144
145
0
@@ -103,7 +103,7 @@ module ActiveRecord
0
       attr_reader :proxy_scope, :proxy_options
0
 
0
       [].methods.each do |m|
0
- unless m =~ /(^__|^nil\?|^send|^object_id$|class|extend|^find$|count|sum|average|maximum|minimum|paginate|first|last|empty\?|any\?|respond_to\?)/
0
+ unless m =~ /(^__|^nil\?|^send|^object_id$|class|extend|^find$|size|count|sum|average|maximum|minimum|paginate|first|last|empty\?|any\?|respond_to\?)/
0
           delegate m, :to => :proxy_found
0
         end
0
       end
0
@@ -136,6 +136,10 @@ module ActiveRecord
0
         end
0
       end
0
 
0
+ def size
0
+ @found ? @found.length : count
0
+ end
0
+
0
       def empty?
0
         @found ? @found.empty? : count.zero?
0
       end
...
256
257
258
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
0
@@ -256,4 +256,19 @@ class NamedScopeTest < ActiveRecord::TestCase
0
   def test_should_use_where_in_query_for_named_scope
0
     assert_equal Developer.find_all_by_name('Jamis'), Developer.find_all_by_id(Developer.jamises)
0
   end
0
+
0
+ def test_size_should_use_count_when_results_are_not_loaded
0
+ topics = Topic.base
0
+ assert_queries(1) do
0
+ topics.size # use count query
0
+ end
0
+ end
0
+
0
+ def test_size_should_use_length_when_results_are_loaded
0
+ topics = Topic.base
0
+ topics.reload # force load
0
+ assert_no_queries do
0
+ topics.size # use loaded (no query)
0
+ end
0
+ end
0
 end

Comments

    No one has commented yet.