Dr. Nic threw down the guantlet about submitting a patch to the scope_out plugin to allow the use of the ActiveRecord::Base#count() method within a scope.
I’m just not sure why it hadn’t occurred to me to submit a patch before extending the plugin. Perhaps I was trying to show off my Ruby-fu, perhaps I didn’t realize GoogleCode allowed patch submissions, or perhaps I’m just trying to artificially raise my post count by doing them separately.
Patching a plugin is dead easy. Knowing which tools to use is about the only tough part.
./lib/scope_out.rbsvn diff and take a look at what shows up. Does that look about right?svn diff > my_clearly_named_patch.diff to create a patch file from your changes.It’s far less work to make a patch than work around the problem:
Index: lib/scope_out.rb
===================================================================
--- lib/scope_out.rb (revision 29)
+++ lib/scope_out.rb (working copy)
@@ -112,6 +112,10 @@
def find_#{name}(*args)
with_#{name} {find(*args)}
end
+
+ def count_#{name}(*args)
+ with_#{name} {count(*args)}
+ end
def calculate_#{name}(*args)
with_#{name} {calculate(*args)}
Update: For shame! Here I go spewing out a patch without any tests! Many thanks to Duncan for pointing this out.
The new patch (uploaded to the scope_out project):
Index: test/scope_out_test.rb
===================================================================
--- test/scope_out_test.rb (revision 29)
+++ test/scope_out_test.rb (working copy)
@@ -173,6 +173,17 @@
Student.calculate_freshmen_active(:count, :all))
end
+ def test_count_methods
+ assert_equal(Student.count(:conditions => "level = 'Freshman'"),
+ Student.count_freshmen)
+ assert_equal(Student.count(:conditions => "age = 18"),
+ Student.count_eighteen_year_olds)
+ assert_equal(Student.count(:conditions => ["active = ?", true]),
+ Student.count_active)
+ assert_equal(Student.count(:conditions => ["active = ? and level = ?", true, 'Freshman']),
+ Student.count_freshmen_active)
+ end
+
def test_passes_limit_option_to_with_scope
assert_equal(Student.find_all_by_active(true, :limit => 1), Student.find_one_active(:all))
end
Index: lib/scope_out.rb
===================================================================
--- lib/scope_out.rb (revision 29)
+++ lib/scope_out.rb (working copy)
@@ -112,6 +112,10 @@
def find_#{name}(*args)
with_#{name} {find(*args)}
end
+
+ def count_#{name}(*args)
+ with_#{name} {count(*args)}
+ end
def calculate_#{name}(*args)
with_#{name} {calculate(*args)}
-
Duncan Beevers said:
Don't forget the important step of writing and submitting tests for your patch!
-
Dr Nic said:
FTW!
blog comments powered by DisqusRelated Posts
Jack Danger Canty
Ruby and Javascript developer @ Cloops Local Coupons
jackcanty.com
github.com/JackDanger
twitter.com/jackdanger
flickr.com/photos/jackdanger