Skip to content

Commit

Permalink
add balance methods to boolean module
Browse files Browse the repository at this point in the history
  • Loading branch information
mjankowski committed Apr 9, 2009
1 parent fa1d7eb commit e628a1d
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
4 changes: 4 additions & 0 deletions README.rdoc
Expand Up @@ -108,6 +108,10 @@ Records that are all admins or non-admins...
User.admin
User.not_admin

The "balance" (count of true minus false for column in question)...

User.admin_balance

= Datetime columns

Records approved before or after certain times...
Expand Down
11 changes: 11 additions & 0 deletions lib/pacecar/boolean.rb
Expand Up @@ -7,6 +7,7 @@ def self.included(base)
module ClassMethods
def self.extended(base)
base.send :define_boolean_scopes
base.send :define_balance_count
end

protected
Expand All @@ -18,6 +19,16 @@ def define_boolean_scopes
end
end

def define_balance_count
boolean_column_names.each do |name|
self.class_eval %Q{
def self.#{name}_balance
#{name}.count - not_#{name}.count
end
}
end
end

end
end
end
19 changes: 19 additions & 0 deletions test/boolean_test.rb
Expand Up @@ -16,6 +16,25 @@ class BooleanTest < Test::Unit::TestCase
proxy_options = { :conditions => ['"users".admin = ?', false] }
assert_equal proxy_options, @class.not_admin.proxy_options
end
context "With boolean column scopes that can count" do
setup do
assert @class.respond_to?(:admin_balance)
@true_mock = mock
@false_mock = mock
@class.expects(:admin).returns @true_mock
@class.expects(:not_admin).returns @false_mock
end
should "return correct value for balance class method when true greater than false" do
@true_mock.expects(:count).returns 5
@false_mock.expects(:count).returns 2
assert_equal 3, @class.admin_balance
end
should "return correct value for balance class method when true less than false" do
@true_mock.expects(:count).returns 2
@false_mock.expects(:count).returns 5
assert_equal -3, @class.admin_balance
end
end
end

end

0 comments on commit e628a1d

Please sign in to comment.